免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8227 | 回复: 16
打印 上一主题 下一主题

一段简单的读文件c程序. 有些疑问. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-29 22:17 |只看该作者 |倒序浏览
cfg文件只有一行ss.
我把问题写在注释中.

  1. #include <stdio.h>;

  2. int main(){
  3.         FILE *dat;
  4.         dat=fopen("./cfg","rt");
  5.         fseek(dat,0,SEEK_END);
  6.         long int k=ftell(dat);                            //这里是3

  7.         char*  input=(char*)malloc(k*sizeof(char));   //分配3byte, 起始地址是xxxx80
  8.         rewind(dat);
  9.         *input=fgetc(dat);
  10.         while(!feof(dat)){
  11.                 *(++input)=fgetc(dat);
  12.         }
  13. //在这里发现input总会跳到第4个地址0xxxx83,可这个                                                                            //地址不是他的啊.奇怪的是结果倒是对的
  14.         fclose(dat);
  15.         printf("%s",input-k);                  //一直觉得应该是input-k+1
  16.         return 1;
  17. }

复制代码

看了半天,不明所以.是不是有什么概念错误?   
  1. [/code][code]
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-05-29 23:00 |只看该作者

一段简单的读文件c程序. 有些疑问.


  1. *(++input)=fgetc(dat);
复制代码

改成

  1. *(input++)=fgetc(dat);
复制代码

就好了。

个人觉得,为了代码清晰,用以下的方式好:

  1. *input=fgetc(dat);
  2. input++;
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-05-30 02:00 |只看该作者

一段简单的读文件c程序. 有些疑问.

这样改就不对了.因为如此就会无条件地input++而很可能会超出分配给她的内存了.
input++;
*input=fgetc(dat);
就是和我的一样.
我的问题是:
对于3个byte 文件 cfg中仅有一行的 ss来说, 为什么我在读完了3byte后,还会再次进入循环,读一个?字符.
晕啊.

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-05-30 13:42 |只看该作者

一段简单的读文件c程序. 有些疑问.

??
怎么会一样,你以前的是地址先往前移动,再赋值,当然会浪费一个了。
你在仔细看看区别。
另外你的程序也没有初始化这块分配的内存,为了放置结束符,应该多分配一个字符空间。读完之后,需要结束。

  1. int main(){
  2.         FILE *dat;
  3.         dat=fopen("./cfg","rt");
  4.         fseek(dat,0,SEEK_END);
  5.         long int k=ftell(dat);                            //这里是3

  6.         char*  input=(char*)malloc((k+1)*sizeof(char));   //分配3byte, 起始地址是xxxx80
  7.         rewind(dat);
  8.         *input=fgetc(dat);
  9.         while(!feof(dat)){
  10.                 *input=fgetc(dat);
  11.                 input++;

  12.         }
  13.              *input = '\0';
  14.         fclose(dat);
  15.         printf("%s",input-k);                  //一直觉得应该是input-k+1
  16.         return 1;
  17. }
复制代码


自己试试看吧

论坛徽章:
0
5 [报告]
发表于 2003-05-31 05:04 |只看该作者

一段简单的读文件c程序. 有些疑问.

先谢谢你的回答.我还是初学者,所以想把一些细节搞搞清楚.
在我的例中.我先*input=fgetc(dat),然后再进入循环,所以首先得input++,再*input=fgetc(dat).
而你的例中,看起来好象第一个字符被第二个字符覆盖了.

不知道我说的对不对.
另外一个问题关于"\0"这个结束符,在存成文件的时候,该不该存进去啊?

论坛徽章:
0
6 [报告]
发表于 2003-05-31 10:09 |只看该作者

一段简单的读文件c程序. 有些疑问.

你的程序没有在字符串后面补\0;
malloc内存的时候没有为\0多申请一个char;
不应该在feof监测之前就fgetc,文件可能是0字节长;
取得malloc对分配的指针不应该改变;
堆使用完后没有free;
程序有点乱(可能咱俩思维习惯不同),我宁愿这样写:


  1. #include <stdio.h>;

  2. int main(){
  3.         FILE *dat;
  4.         long int k,i=0;
  5.         char tmp,*input;

  6.         dat=fopen("./cfg","rt");
  7.         fseek(dat,0,SEEK_END);
  8.         k=ftell(dat);
  9.         input=(char*)malloc((k+1)*sizeof(char));
  10.         rewind(dat);
  11.         while(!feof(dat)){
  12.                 tmp=fgetc(dat);
  13.                 if (tmp==EOF) tmp='\0';
  14.                 input[i++]=tmp;
  15.         }
  16.         fclose(dat);
  17.         printf("%s\n",input);
  18.         free(input);
  19.         return 1;
  20. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-05-31 12:36 |只看该作者

一段简单的读文件c程序. 有些疑问.

哦,没注意while前面还有个fgetc,去掉,我那程序就正确了。

为了malloc空间的释放和指针的完整,确实应该采用JohnBull的风格。

论坛徽章:
0
8 [报告]
发表于 2003-05-31 15:21 |只看该作者

一段简单的读文件c程序. 有些疑问.

可按JohnBull 的程序编译通过
但执行时总是提示 “Segmentation fault"
能说明是什么原因么?

论坛徽章:
0
9 [报告]
发表于 2003-05-31 16:01 |只看该作者

一段简单的读文件c程序. 有些疑问.

原帖由 "xjleijie" 发表:
可按JohnBull 的程序编译通过
但执行时总是提示 “Segmentation fault"
能说明是什么原因么?
   

因为我为了不对他的程序做太大的改动所以没有检查fopen是否成功。你肯定没建cfg。

论坛徽章:
0
10 [报告]
发表于 2003-06-01 00:35 |只看该作者

一段简单的读文件c程序. 有些疑问.

感谢johnbull大牛的提醒. 你的回贴向来很精彩,一锤定音.
如此看来在文件的末尾还有一个EOF字符. 而feof()只有在这个字符之后,才会返回true.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP