user-0 提问: 关于C语言中文件输入与输出的问题

回复:
user: user-1
content: 给你贴上代码，在你的基础上修改了一下： #include <stdio.h> #include <stdlib.h> void main(void) { char filename[20]; int ch; FILE *fp; long count=0;	 printf("请输入文件的名称:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("Cant open %s\n",filename); exit(1); } fprintf(fp,"%s",filename);                     fclose(fp);                                   //-------fprint函数是将缓存写到文件里，用它需要关闭文件。 fp=fopen(filename,"r");						// 打开该文件只读。							 while((ch=getc(fp))!=EOF)                  {                                          putc(ch,stdout); count++; } fclose(fp); printf("File %s has %lf characters\n",filename,(float)count);//另外，你count定义的是int型，你输出确实lf型，所以给你强制转换（float）count }

user: user-1
content: 原因是你fprintf（）函数用完了以后没有fclose文件，数据根本没有写到文件里面，你可以单步调试，文件里面是空的。根本就没有数据。

user: user-2
content: 有三个明显的错误 1.  fopen(name, "w") 只能写不能读 用读写方式打开用fopen(name, "w+b"); 2. fread和fwrite之间要加上fseek之类的定位操作 3. int 类型的printf格式为%d

user: user-0
content: 引用 6 楼 hwx342840456 的回复:说的简单一点，就是fprintf()函数用了以后函数指针是指向的文件末尾，用关掉文件，和rewind都可以将指针指向开头，这时候才写进了文件。我是这么理解的，其它大神可以帮忙给你解释一下。 受教了~~

user: user-1
content: 另外遇到问题多F9,F10,F11调试一下，一下就能看出问题处在哪儿了。多调试，多百度。其实答案 还是满好找的。我也是新手，才入门C，互相学习。

user: user-1
content: 说的简单一点，就是fprintf()函数用了以后函数指针是指向的文件末尾，用关掉文件，和rewind都可以将指针指向开头，这时候才写进了文件。我是这么理解的，其它大神可以帮忙给你解释一下。

user: user-1
content: 引用 4 楼 ikuovbs 的回复:[quote=引用 2 楼 hwx342840456 的回复:] 给你贴上代码，在你的基础上修改了一下： #include <stdio.h> #include <stdlib.h> void main(void) { char filename[20]; int ch; FILE *fp; long count=0;	 printf("请输入文件的名称:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("Cant open %s\n",filename); exit(1); } fprintf(fp,"%s",filename);                     fclose(fp);                                   //-------fprint函数是将缓存写到文件里，用它需要关闭文件。 fp=fopen(filename,"r");						// 打开该文件只读。							 while((ch=getc(fp))!=EOF)                  {                                          putc(ch,stdout); count++; } fclose(fp); printf("File %s has %lf characters\n",filename,(float)count);//另外，你count定义的是int型，你输出确实lf型，所以给你强制转换（float）count }  大哥，可以解释一下为何fprintf将缓冲写入了文件之后，用它需要关闭文件的原因吗?[/quote]  因为你上面的打开文件是只写啊，就输出以后，就关掉，再打开，后面才能读。你也可以像楼上说的这样改，将文件该文读写，然后fprintf（）；注意这里fp已经指到文件末尾了，需要指到开头，所以需要rewind一下。 代码如下： void main(void) { char filename[20]; int ch; FILE *fp; long count=0;	 printf("请输入文件的名称:"); scanf("%s",filename); if((fp=fopen(filename,"w+"))==NULL)//修改为读写。 { printf("Cant open %s\n",filename); exit(1); } fprintf(fp,"%s",filename);  rewind(fp);                                      //这里是关键，需要将fp指针指向文件开头;                   //fclose(fp);           修改                         //fp=fopen(filename,"r");	修改 	 while((ch=getc(fp))!=EOF)                  {                                          putc(ch,stdout); count++; } fclose(fp); printf("File %s has %lf characters\n",filename,(float)count);//另外，你count定义的是int型，你输出确实lf型，所以给你强制转换（float）count }

user: user-0
content: 引用 2 楼 hwx342840456 的回复:给你贴上代码，在你的基础上修改了一下： #include <stdio.h> #include <stdlib.h> void main(void) { char filename[20]; int ch; FILE *fp; long count=0;	 printf("请输入文件的名称:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("Cant open %s\n",filename); exit(1); } fprintf(fp,"%s",filename);                     fclose(fp);                                   //-------fprint函数是将缓存写到文件里，用它需要关闭文件。 fp=fopen(filename,"r");						// 打开该文件只读。							 while((ch=getc(fp))!=EOF)                  {                                          putc(ch,stdout); count++; } fclose(fp); printf("File %s has %lf characters\n",filename,(float)count);//另外，你count定义的是int型，你输出确实lf型，所以给你强制转换（float）count }  大哥，可以解释一下为何fprintf将缓冲写入了文件之后，用它需要关闭文件的原因吗?