C 同时读取和写入文件时出现问题

C 同时读取和写入文件时出现问题,c,file-handling,C,File Handling,我正在尝试用C同时读取和写入文件。我可以写入文件,但无法读取文件。有什么建议吗 #include <stdio.h> int main() { char *str = "C programming language"; char str1[100]; FILE *fptr = fopen("Output.txt", "r+"); if (fptr == NULL) printf("Could not open file!");

我正在尝试用C同时读取和写入文件。我可以写入文件,但无法读取文件。有什么建议吗

#include <stdio.h>
int main()
{
    char *str = "C programming language";
    char str1[100];
    FILE *fptr = fopen("Output.txt", "r+");
    if (fptr == NULL)
        printf("Could not open file!");
    fputs(str, fptr);

    fgets(str1,100,fptr);
    fclose(fptr);
    printf("%s", str1);
    return 0;
}
#包括
int main()
{
char*str=“C编程语言”;
char-str1[100];
文件*fptr=fopen(“Output.txt”、“r+”);
如果(fptr==NULL)
printf(“无法打开文件!”);
fputs(str,fptr);
fgets(STR1100,fptr);
fclose(fptr);
printf(“%s”,str1);
返回0;
}
请假定我的计算机上已经存在output.txt文件。引用:

对于打开以进行更新的文件(包含“+”号的文件),其中 允许输入和输出操作,流应为 冲洗(fflush)或重新定位(fseek、fsetpos、REFLIND)在 在写入操作之后的读取操作。这条小河 在写入操作之前重新定位(fseek、fsetpos、倒带) 在读取操作之后(当该操作未执行时) 到达文件末尾)


完成写操作后,应该查找文件的开头。对于该调用rewind()

以下是更正后的代码:

#include <stdio.h>
int main()
{
    char *str = "C programming language";
    char str1[100];
    FILE *fptr = fopen("Output.txt", "r+");
    if (fptr == NULL)
        printf("Could not open file!");
    fputs(str, fptr);

    rewind(fptr); // seek to beginning

    fgets(str1,100,fptr);
    fclose(fptr);
    printf("%s", str1);
    return 0;
}
#包括
int main()
{
char*str=“C编程语言”;
char-str1[100];
文件*fptr=fopen(“Output.txt”、“r+”);
如果(fptr==NULL)
printf(“无法打开文件!”);
fputs(str,fptr);
倒带(fptr);//寻找开始
fgets(STR1100,fptr);
fclose(fptr);
printf(“%s”,str1);
返回0;
}

您需要将偏移量重新定位到开始读取该字符串的位置

写入后,指针位于超出所写入字符串的偏移量处

#include <stdio.h>
int main()
{
    char *str = "C programming language";
    char str1[100];
    FILE *fptr = fopen("Output.txt", "r+");
    if (fptr == NULL)
        printf("Could not open file!");
    fputs(str, fptr);

    fseek(fptr, 0, SEEK_SET); // add this
    fgets(str1,100,fptr);
    fclose(fptr);
    printf("%s", str1);
    return 0;
}

./main.out
C programming language
#包括
int main()
{
char*str=“C编程语言”;
char-str1[100];
文件*fptr=fopen(“Output.txt”、“r+”);
如果(fptr==NULL)
printf(“无法打开文件!”);
fputs(str,fptr);
fseek(fptr,0,SEEK_SET);//添加此
fgets(STR1100,fptr);
fclose(fptr);
printf(“%s”,str1);
返回0;
}
/main.out
C程序设计语言

一般来说,麻烦比它值得的多。考虑一下,如果你真的想使用一个文件来使用你应该使用的内存。代码需要在<代码>写()/<代码>和<代码>读()/代码>之间的文件描述符上调用<代码> f>代码>,因此该文件将是“更新的”关于:<代码> PrimTf(“不能打开文件!”);代码>1)错误消息应输出到
stderr
,而不是
stdout
2)还应输出到
stderr
系统认为发生错误的文本原因。3) 函数:
perror()
正确处理#1和#2。4) 文件未打开,因此不能像文件已打开一样继续执行代码。应调用
exit(exit_失败)关于:
fgets(str1100,fptr)
应始终检查返回值,如果为NULL,则操作失败。因此,不应该继续执行代码,就好像对
fgets()
的调用成功了:
fputs(str,fptr);fgets(STR1100,fptr)
调用
fputs()
后,“文件指针”将超过包含刚写入数据的位置。因此需要使用
fseek()
将“文件指针”移回刚刚写入的数据的开头。