文件读写模式" r +" C中的意外行为

时间:2015-09-25 14:53:10

标签: c debugging fopen

在以下代码中,我正在搜索'。'在我的模板中粘贴后面的字符串。出于某种原因,虽然字符串按预期粘贴,但它会从我的模板中删除一些文本。我不知道问题出在哪里。尝试fflush()效果不佳。

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

int main() {
    FILE * fp;
    int tmp_char, tmp_offset;
    char file_name[50] = "FileIoTest_template.txt";
    char tmp_string1[50] = "Generic String 1";
    char tmp_string2[50] = "Generic String 2";
    long tmp_long;

    fp = fopen(file_name, "r+");
    //fseek(fp, 0, SEEK_SET);

    do {
        tmp_char = fgetc(fp);
        printf("%c ", tmp_char);
        if (tmp_char == '.')
           break;
    } while (tmp_char != EOF);
    tmp_long = ftell(fp);
    fseek(fp, tmp_long, SEEK_SET);
    tmp_offset = strlen(tmp_string1);
    fputs(tmp_string1, fp);
    fputs("\n", fp);
    //fflush(fp);

    fseek(fp, tmp_long+tmp_offset, SEEK_SET);
    do {
        tmp_char = fgetc(fp);
        printf("%c ", tmp_char);
        if (tmp_char == '.')
            break;
    } while (tmp_char != EOF);
    tmp_long = ftell(fp);
    fseek(fp, tmp_long, SEEK_SET);
    fputs(tmp_string2, fp);
    fputs("\n", fp);
    //fflush(fp);

    fclose(fp);
    return 0;
}

这是我的模板,&#34; FileIoTest_template.txt&#34;:

Sample list:
1.
2.
3.
random text

4.
5.
6.

bunch of random text

我的代码输出是:

Sample list:
1.Generic String 1
ext

4.Generic String 2
of random text

1 个答案:

答案 0 :(得分:2)

您无法通过将数据插入其中间来轻松修改文件,而无需替换已存在的任何内容。您需要覆盖整个文件,从插入点到结尾(通过原始结束到新端需要的任何点)。这样做是很棘手的,尝试是不安全的,因为如果进程在中间被中断,那么你的文件就会被破坏。

通常,人们会在临时文件中创建新版本的文件内容,一旦成功完成,就会用新文件替换原始文件。