zoukankan      html  css  js  c++  java
  • 用结构体读取文件

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>

    int main(void)
    {
    struct data
    {
    char id[20];
    char name[20];
    char sex[10];
    int old;
    char number[20];
    char habit[10];
    char b[10];
    int piao;
    } student[10];
    FILE *fp;
    if((fp=fopen("shiyan.txt","r"))==NULL)
    {
    printf("File cannnot be open!");
    exit(1);
    }
    int i=1;
    char line[10][100];
    while(!feof(fp))
    {
    fgets(line[i],100,fp);
    if(strlen(line[i])>10)//有些行只含一个回车 当然不能作为一个结构体读取
    {

    sscanf(line[i],"%s %s %s %d %s %s %s %d ",student[i].id,
    student[i].name,
    student[i].sex,
    &student[i].old,
    student[i].number,
    student[i].habit,
    student[i].b,
    &student[i].piao);
    i++;
    }
    }
    fclose(fp);

    int n;

    printf("投票选手:");
    scanf("%d",&n);
    student[n].piao++;

    if((fp=fopen("shiyan.txt","w"))==NULL)
    {
    printf("File cannot be open!");
    exit(1);
    }
    printf("i=%d",i);
    for(int j=1;j<i;j++)
    {
    fprintf(fp,"%s %s %s %d %s %s %s %d ",student[j].id,
    student[j].name,
    student[j].sex,
    student[j].old,
    student[j].number,
    student[j].habit,
    student[j].b,
    student[j].piao
    );
    }

    fclose(fp);
    return 0;
    }

    //文件shiyan.txy 

    //文件内容

    id:1 朱逸文 男 20 201408091097 电脑 票数: 0
    id:2 徐晓红 女 45 65643 烧饭 票数: 0
    id:3 朱长才 男 50 66441231213 看书 票数: 0

    //输入内容:2

    //文件修改后的内容

    id:1 朱逸文 男 20 201408091097 电脑 票数: 0
    id:2 徐晓红 女 45 65643 烧饭 票数: 1
    id:3 朱长才 男 50 66441231213 看书 票数: 0

    总结:这是一个对文件部分内容进行修改的一个程序 而这种修改的思路

    1:读取文件所有内容(需要修改和不需要修改的)到结构体中

    2:用各种方法在结构体中定位需要修改的内容 

    3:在结构体中修改这部分内容

    4:把修改后的结构体全部写入文件中

    在这其中遇到的问题:

    1:读取文件内容到结构体中 刚开始想的很单纯 用一个循环 while(!feof(fp)) 一个结构体一个结构体读 后面证明 这种方法有缺陷! 因为文件内容是其实我用另一个程序写进文件中的 其有固定的格式 值得注意的一点格式就是 每一行数据后面都有一个回车(这样可以使数据更直观)。但面对这种格式 用以上的读取就会出现问题 即:当读完

    id:3 朱长才 男 50 66441231213 看书 票数: 1的时候。 其实 还没有到文件末尾 所有会再读取一个结构体 而这个结构体的内容只有一个回车 导致最后这个结构体内部的内容变成乱码。 后用fgets(line[i],100,fp);
                      if(strlen(line[i])>10);解决

    这里引入一个Line的媒介,使那些只含回车 空格的一些无用内容就直接不读如结构中了 这样就避免的上面的问题。

  • 相关阅读:
    mysql 主从服务器配置
    Linux命令
    Kali
    Python进阶
    性能测试工具
    sphinx搜索
    页面静态化
    PHP API接口
    线程的生命周期
    多线程的创建
  • 原文地址:https://www.cnblogs.com/aloney/p/4732069.html
Copyright © 2011-2022 走看看