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 }
不知道哪里错了,,,,输出有问题,可以写进文件,但是输出到屏幕上不行是需要再打开一次么
#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)还有些其他问题,若只是进行测试跑的话问题不算大。
例如:没有变量初始化了;没对函数的正确性进行检查了;变量起名时存在魔数了且含义不明确等等,就不再一一举例了。
希望上述回答对你有些帮助!!
不好意思,刚刚看了下回答,显示好像有些问题, 如本来写的是路径中的“\"最后显示成一个“\”了。
第一次打开文件后关闭文件再打开就行了