在 C 中读取文件:"r" 和 "a+" 标志的不同行为

Reading a File in C: different behavior for "r" and "a+" flags

我想打开一个文件,读取其内容,然后向该文件追加一行。我想我应该为任务使用 "a+" 标志。

我有一个函数可以打开一个文件和 returns 一个指向这个文件的指针。

FILE* open_weekly_disk_file(char* filename){
    FILE* weekly_log;

    weekly_log = fopen(filename, "a+");
    //weekly_log = fopen(filename, "r");

    if(! weekly_log){
        printf("The attempt to open the weekly log failed!\n");
        return NULL;
    } else{
        return weekly_log;
    }
}

然后我有一个函数调用上面的函数并使用 scanf 从文件中读取内容:

void sample_function(char* filename){
    FILE* log;
    char token[100], current_read[100];
    int limit;

    log = opened_weekly_disk_file(filename);
    // The problem happens here
    for(limit=0; limit < TOKEN_NUMBER; limit++){
        if(fscanf(log, "%s%s", &token, &current_read) == 2){
            printf("%s %s\n", token, current_read);
        }
    }
    ...
}

此代码在我使用时有效:

weekly_log = fopen(filename, "r");

但是当我将 "r" 标志更改为 "a+" 时不起作用。我在 for 循环之前遇到了分段错误。

那是因为模式规范"a"打开一个文件进行追加,文件指针在末尾。如果您尝试从此处读取,则没有数据,因为文件指针位于 EOF。你应该打开 "r+" 进行阅读和写作。如果您在写入之前读取整个文件,那么当您写入更多数据时,文件指针将正确定位以追加。

如果这还不够,请探索 ftell()fseek() 函数。

来自 this SO QA

from the man page: a+

Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.

答案:

There is just one pointer which initially is at the start of the file but when a write operation is attempted it is moved to the end of the file. You can reposition it using fseek or rewind anywhere in the file for reading, but writing operations will move it back to the end of file.

所以,问题是不是文件是以附加模式打开的事实,因为就读取而言它不是。

问题在于你的代码在这三个点中做了什么

log = opened_weekly_disk_file(filename);
    ...

代码很可能写入文件,使文件光标在读取发生之前移动到文件末尾。