fscanf 问题,不能正确输出

1 #include
2 #include
3
4 int main() {
5 char *s="helloworld";
6 char t[20];
7 FILE *a;
8 a=fopen("e:\Helloworld.txt","a+");
9 fprintf(a,"%s",s);
10 //fscanf(a,"%s",s);
11 fgets(t,sizeof(s),a);
12 printf("%s",t);
13
14
15 }
不知道哪里错了,,,,输出有问题,可以写进文件,但是输出到屏幕上不行是需要再打开一次么

问题出现在你没有理解文件操作的原理!

打开一个文件会有一个文件指针指向该文件,该指针记录了你读写文件时的位置,读或者写都共用同一文件指针。
你第一次打开文件后,文件指针指向了文件的开头,然后你往文件中写入了"helloworld"10个字节的字符串,这时文件指针指向了文件的末尾,
接着你想要从刚写完的文件中读取它的值,但文件指针指向的时末尾,所以读取时什么也没有读到,这就是为什么你打印输出时没有显示的原因!

解决问题:

写完文件时,把文件指针回到开头,这时就可以读取刚才写入的内容了!我把刚才写的原理转换代码给你看看:
#include <stdio.h>
#include <string.h>

int main(void) 
{
    char *s="helloworld";
    char t[20];

    FILE *a;
    a = fopen("e:\Helloworld.txt","a+"); 
    fprintf(a, "%s", s);    /* 这里你对文件写入了"helloworld"10个字符 */

    /* 此时文件指针指在文件末尾即"helloworld"后面
     * 可以使用函数ftell()来获取文件指针的位置 */
    int ret;
    ret = ftell(a);
    printf("文件位置:%d\n", ret);  // 可以知道返回值为10,即写入字符串的长度

    /* 想要读取刚才写入的字符串,此时需要把文件指针回到开头,
     * 使用函数rewind()把指针回到开头 */
    rewind(a);

    /* 再读取文件指针的位置 */
    ret = ftell(a);
    printf("文件位置:%d\n", ret);  // 这时可以发现返回值为0,即回到了文件开头

    /* 接下来就是你想要读取刚才写入内容的步骤了 */

    /* 这里提个醒,你的代码写错了,你的源代码为
     * fgets(t,sizeof(s),a);
     * 首先s为指针,使用sizeof(s)获取的时指针s的大小,这里
     * 指针大小为4个字节,所以如果这样读取的话,只能读取前4个字符
     * 正确的读取方式是 strlen(s) 这样获取的才是字符串s的长度
     */
    fgets(t, strlen(s)+1, a); // strlen(s)加1是因为fgets会自动读取少一个字符  
    printf("%s\n", t);

    fclose(a);     // 有打开文件就有关闭文件,这是个好习惯
    return 0;      // main函数应该最好返回0,表示程序执行成功
}


好了,好好理解我的注释,写了好久,希望能够对你有所帮助!

下面这样就可以了

char *s="helloworld";
 char t[20];
 FILE *a = fopen("e:\Helloworld.txt", "a+");
    FILE *b = fopen("e:\Helloworld.txt, "r+");
    fprintf(a, "%s", s);

    fflush(a);
    int cnt = fscanf(b,"%s",t);

    printf("%s", t);

因为我粘贴你的...路径最好这样写:"e:/Helloworld.txt"

加上fflush和fclose,然后再打开

fprintf函数执行后,内核管理模块会将输出内容写入缓冲区,而不是立即写入文件。若是需要立即写入文件,那么在fprintf后再增加fflush(a);

你这个fprintf使用错误,图片说明
请看使用例题图片说明
望采纳

#include
#include

int main()
{
char* s = "helloword";
char t[20];
FILE* a;
a=fopen("./a.txt", "a+");
fprintf(a, "%s", s);
fclose(a);
a=fopen("./a.txt", "r+");
fgets(t,sizeof(t), a);
fclose(a);
printf("%s", t);
printf("%d", sizeof(s));
return 0;
}

1.a+模式打开文件偏移在文件尾部,所以需要调整文件偏移到头部,
我这里直接关闭文件,重新以r+打开即可。当然也可以直接调用api调整偏移到文件头部。
2.fgets中的sizeof(s)是对指针求sizeof,指针的sizeof是一个固定值,
依赖于你是32bit或者64bit机器。并不是你期望的helloword字符串的长度。我这里改为sizeof(t),既是这个buf的长度。

题主可以区看看fseek的用法

楼主希望你能看到我
之所以输出有问题是因为fgets的东西就是错的。
你在第一次写完之后要关闭文件,才能对文件再次操作,所以你在fgets前重新打开一次结果就正常了。

至于根本原因是fprintf函数执行后,内核管理模块会将输出内容写入缓冲区,而不是立即写入文件
ps:作为一个好习惯,打开文件用完之后记得关闭,指针用完之后记得置空,申请内存用完之后记得free、
鄙人是金庸迷
请楼主给分,谢谢!~

你的源码如下:
char *s="helloworld";
char t[20];
FILE *a;
a=fopen("e:\Helloworld.txt","a+");
fprintf(a,"%s",s);
//fscanf(a,"%s",s);
fgets(t,sizeof(s),a);
printf("%s",t);

这段测试代码的问题比较多啊!
(1)下面主要说个你关心的。
下面这条语句会存在无效指针“s”的引用错误!!
运行后有很可能会出现程序崩溃的问题。
fscanf(a,"%s",s);
指针“s”指向的是一个常量字符串的首地址。此处应该为变量“s”申请一段内存才行。
另外,fprintf是带缓冲区的,且它走完后把文件头指针移到了文件的末尾。
若想得到你想要的结果,最好还需把缓冲区的内容写入磁盘,并把文件指针移到文件开头。
即在fscanf之前加两条语句:
fflush(a);
fseek(a, 0L, SEEK_SET);
(2)文件的路径 "e:\Helloworld.txt",若想输入“\”在c语言中应该是'\'。
所以应该是 "e:\Helloworld.txt"。
(3)还有些其他问题,若只是进行测试跑的话问题不算大。
例如:没有变量初始化了;没对函数的正确性进行检查了;变量起名时存在魔数了且含义不明确等等,就不再一一举例了。

    希望上述回答对你有些帮助!!

不好意思,刚刚看了下回答,显示好像有些问题, 如本来写的是路径中的“\"最后显示成一个“\”了。

第一次打开文件后关闭文件再打开就行了