【问题标题】:How to update struct text file line by line如何逐行更新结构文本文件
【发布时间】:2022-01-02 16:04:18
【问题描述】:

我的代码将所有活动详细信息存储在一个文件中,我在使用 id 搜索访问该文件中的数据时遇到问题。这是我的添加活动函数和结构。

struct activities{
    char id[5];
    char actName[200];
    char date[20];
    char day[20];
}act;
//function to add volunteering activities
void addAct(){
    FILE *fileAct;
    
    //prompt user to enter activities details
    printf("\n\t Planning Volunteering Activities");
    printf("\n\t -----------------------------------");
    printf("\n\t Program ID \t: ");
    scanf(" %[^\n]%*c", &act.id);
    printf("\t Name of Activity : ");
    scanf(" %[^\n]%*c", &act.actName);
    printf("\t Date \t\t: ");
    scanf(" %[^\n]%*c", &act.date);
    printf("\t Day \t\t: ");
    scanf(" %[^\n]%*c", &act.day);
    
    //create & write in file activity
    fileAct = fopen("Activity", "a");
    
    fprintf(fileAct, "\n\t %s \n", act.id);
    fprintf(fileAct, "1. Name of Activity : %s \n", act.actName);
    fprintf(fileAct, "2. Date : %s \n", act.date);
    fprintf(fileAct, "3. Day : %s \n", act.day);
    
    //close file activity
    fclose(fileAct);
}

这是我的更新功能。

void updateAct(){
    //variable declaration
    char progID[5];
    
    //open activity file
    FILE *fp = fopen ("Activity", "r");
    
    //prompt user to search activities to update
    printf("\t Search by Program ID : ");
    scanf(" %[^\n]%*c", &progID);
   
    while( !feof(fp)){
        fread (&act, sizeof(struct activities), 1, fp);
        
        if (strcmp(progID, act.id) == 0)
            printf("%s %s", act.id, act.actName);
    }
    fclose(fp);
}
    

在上面的更新函数中,我无法根据用户搜索访问struct中的act.id,而是程序将整个数据显示在文件中。如何解决这个问题?

【问题讨论】:

  • 请提供信息:实际输出是什么,期望的输出是什么,输入的样子。
  • 注意:while (!feof(...)) 错误,导致对最后一条记录进行两次处理...
  • 用户输入id,然后程序应该只显示该id的所有活动信息。但是,对于我的代码,尽管我尝试仅显示 act.id,但程序会显示该特定文件中的所有数据。
  • @SergeBallesta 你能指导我用什么来替换 while 语句吗?
  • @penguinsoo:我提供的链接应该可以解释一切......(比我能写的要好得多)

标签: c function struct


【解决方案1】:

您提供指向 char 数组的指针,从技术上讲,它是指向指针的指针。但是scanf只需要指针。

删除scanf()-调用中的&,并为格式参数添加最大长度说明符:

改变

scanf(" %[^\n]%*c", &progID);

scanf(" %4[^\n]%*c", progID);

对于一个 5 字节的缓冲区。

【讨论】:

  • 好的,我试过了,但是你能指导我如何访问与用户提示的 id 匹配的文件中的数据吗?
【解决方案2】:
void readLine(char* message, char* buffer, int buffer_size)
{
    printf("\t%s: ", message);
    fgets(buffer, buffer_size, stdin);
    // fgets inserts '\n' at the end
    // we are removing it
    buffer[strlen(buffer) - 1] = '\0'; 
}

void addAct(){
    FILE *fileAct;
    struct activities newAct;
    //prompt user to enter activities details
    printf("\n\tPlanning Volunteering Activities");
    printf("\n\t-----------------------------------\n");

    readLine("Program ID", newAct.id, sizeof(newAct.id));
    readLine("Name of Activity", newAct.actName, sizeof(newAct.actName));
    readLine("Date", newAct.date, sizeof(newAct.date));
    readLine("Day", newAct.day, sizeof(newAct.day));

    //create & write in file activity
    fileAct = fopen("Activity", "ab+");
    if(NULL != fileAct) {
        fwrite(&newAct, sizeof(struct activities), 1, fileAct);
        //close file activity
        fclose(fileAct);
    }
}

void updateAct(){
    //variable declaration
    char progID[5];
    struct activities readAct;
    //open activity file
    FILE *fp = fopen("Activity", "rb");
    if(NULL != fp) {
        //prompt user to search activities to update
        printf("\tSearch by Program ID : ");
        fgets(progID, sizeof(progID), stdin);
        progID[strlen(progID) - 1] = '\0';
        while(fread(&readAct, sizeof(struct activities), 1, fp) != 0){
            if (strcmp(progID, readAct.id) == 0)
            {
                printf("%s %s\n", readAct.id, readAct.actName);
                break;
            }
        }
        fclose(fp);
    }
}

【讨论】:

  • 对不起,我的程序似乎无法读取这一行 while(fread(&readAct, sizeof(struct activities), 1, fp) != 0)
  • 您是否遇到编译错误,或者它的行为与您预期的不一样?
  • 程序结束,没有打印 readAct.id 和 readAct.actName
  • act.id 中是否有空格,在测试此版本之前是否删除了Activities 文件?
猜你喜欢
  • 2017-07-23
  • 1970-01-01
  • 2020-08-15
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多