在c中与fputc斗争

时间:2013-12-25 12:44:43

标签: c file

在文件"file1.dat"中我写了"anahasapples"
然后我写了这个程序:

    #include <stdio.h>
    #include <conio.h>

    int main()
    {
        FILE *ptr_file;
        ptr_file=fopen("file1.dat","r+");
        printf("%c",fgetc(ptr_file));
        printf("%c",fgetc(ptr_file));
        printf("%c\n",fgetc(ptr_file));
        char c;
        printf("char:\n");
        c=getch();
        fputc(c,ptr_file);

        return 0;
    }

我从文件中打印前3个字符的部分有效。之后,我想在文件中放入一个字符。
当我编译它时,我没有收到任何错误,但包含的文本没有改变。

2 个答案:

答案 0 :(得分:5)

Documentation for fopen()标准地显示以下解释:

  

使用更新模式打开文件时(+作为第二个或第三个文件)   输入和输出都可以是模式参数中的字符   在关联的流上执行。但是,输出一定不能   直接跟着输入,没有干预fflush(3C)   或文件定位功能(fseek(3C),fsetpos(3C)或   倒带(3C)),输入不能直接跟随输出而不是   对文件定位功能的干预调用,除非   输入操作遇到文件结束。

只需在代码中添加一个fseek(),一切正常:

#include <stdio.h>
#include <conio.h>

int main()
{
    FILE *ptr_file;
    ptr_file=fopen("file1.dat","r+");
    printf("%c",fgetc(ptr_file));
    printf("%c",fgetc(ptr_file));
    printf("%c\n",fgetc(ptr_file));
    char c;
    printf("char:\n");
    c=getch();
    fseek( ptr_file, 0, SEEK_CUR );   /* Add this line */
    int err = fputc(c,ptr_file);
    printf ("err=%d\n", err);

    return 0;
}

这是输入'x'之前和之后的file1.dat:

  

anahasapples

  

anaxasapples

似乎默认情况下fputc()尝试写入文件的末尾,因此您需要重新定位文件指针(例如,使用fseek)以使写入发生在当前文件指针的位置。

答案 1 :(得分:1)

首先设置指针

 fseek(ptr_file, ftell (ptr_file), SEEK_SET);
        fputc(c,ptr_file);

请参阅此链接以获取解释http://cplus.about.com/od/learningc/ss/files_8.htm

http://www.rainydayz.org/beej/bgc/fseek.html