以 r+ 模式写入的额外空格

extra spaces written in r+ mode

在下面的代码中,如果我在查找文件指针到行后的起始位置后写入数据,则会附加额外的 spcaes(可能约为 300 space)

fseek(fp1,0,SEEK_SET);

如果我评论第二个 fputs() 函数调用,没有问题。 此外,输入的数据不会在末尾附加,而是仅附加 spaces。 我无法确定问题所在。

我正在使用 TDM-GCC-64 编译器。

出于测试目的,file1.txt 开头有内容 "Welcome to You All"。 输入数据:"Today" 程序执行后的输出: "Todayme to You All" 后跟许多 spaces.

int main()
{
    FILE *fp1;
    char ch;
    char data[50];
    fp1=fopen("file1.txt", "r+");
    if(fp1==NULL)
    {
        printf("Error in Opening the file\n");
        return(0);
    }

    printf("Read and Write Mode. The data in the file is\n");
    while((ch=getc(fp1))!=EOF)
    {
        putc(ch,stdout);
    }
    // Write some data at the end of the file
    printf("\nEnter some data to be written to the file\n");
    gets(data);
    fseek(fp1,0,SEEK_END);
    fputs(data,fp1);
    fseek(fp1,0,SEEK_SET);
    fputs(data,fp1);
    printf("data in file after write operation is\n");
    while((ch=getc(fp1))!=EOF)
    {
        putc(ch,stdout);
    }
    fclose(fp1);
    return 0;
}

您应该查看 fopen 文档中的细则:

In update mode ('+'), both input and output may be performed, but output cannot be followed by input without an intervening call to fflush, fseek, fsetpos or rewind, and input cannot be followed by output without an intervening call to fseek, fsetpos or rewind, unless the input operation encountered end of file.

读取和写入可能会被缓冲,但仍共享一个文件位置。在不提醒运行时 (fseek) 的情况下切换模式可能会弄乱缓冲。正如您所注意到的!