免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lixforalpha
打印 上一主题 下一主题

[C] c语言 关于文件的两个问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2003-12-26 14:03 |只看该作者

c语言 关于文件的两个问题

再次感谢各位老大  授业解惑
虽然偶的功力尚浅,看了之后有点晕 @_@,但偶会去努力尝试!  
Thanks very much for your help!

http://www.dingbing.com/
这里的china-pub c/c++的书很多的!想要就快下吧!

论坛徽章:
0
32 [报告]
发表于 2003-12-26 16:48 |只看该作者

c语言 关于文件的两个问题

最终源代码:
#include "stdio.h"
int test(void)
{int n;
char c;
FILE *fp;
  if((fp=fopen("f:\\tc\\fputc\\temp\\fputc.dat","wb")==NULL) return 1;
   for(n=0;n<10;n++)
     {c=getchar();
      fputc(c,fp);
     }
fclose(fp);
return 0;
}
int fcopy(void)
{char c;
FILE *fp,*fp1;
if((fp=fopen("f:\\tc\\fputc\\temp\\fputc.dat","rb")==NULL) return 1;
if((fp1=fopen("f:\\tc\\fputc\\temp\\fputc1.dat","wb")==NULL) return 1;
while((c=fgetc(fp))!=EOF) fputc(c,fp1);
fclose(fp);
fclose(fp1);
return 0;
}
main()
{if(test())printf("File not create!\n";
if(fcopy()) printf("File not copyed!\n";
printf("file successful copyed!\n";
return 0;
}

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

c语言 关于文件的两个问题

要使每个人都像lixforalpha就好了,每一步贴上了插图

我说说自己的看法

对于文件来说
从存储形式上来说,我们区分为ASCII码文件和二进制文件

谢看看这二者的区别:
ASCII码文件的每1个字节存储1个字符,而二进制文件1个字节并不对应1个字符(一般的情况)。

一般的我们操作文件的时候会定义一个数据结构的神明,便是FILE *
如果按照这样的方式操作文件的话,那么:
系统给每个打开的文件都在内存中开辟一个区域,用于存放文件的有关信息(如文件名、文件位置等)。这些信息便保存在FILE中。因此选择什么样的借口函数来打开文件行为有点差异,如fopen、open。不同的函数导致OS用不同的机制来响应用户的调用操作。

从读写上看,fgets和fgetc都是从文件指针中获取数据。fgetc一次一个字符,读到了指针便后移,这个函数返回读到字符(int)值。如果结束了继续读,可能不会出错,这个时候的值可能是一个0,也可能是一个其它的字符,因此如果用fgetc,那么必须对读到的字符作判断已确定是否结束。

对于fgets函数,可以用调用这制定每次读取的个数,从实现上看,fgets会计算读取到的文件字符长度总和,然后移动文件指针,这个函数结束的条件是碰到文件结束弗或者换行,并且这个函数会自动的添加'\0'到缓存字符的串末尾。

fread的机制和fgets一样,可能fread内部调用fgets。

最后看看文件结束了是什么情况
和文件结束的一个是使用feof,一个是调用这根据读取的字符判断
如果使用feof,那么对ASCII文件和二进制文件操作都可以。这个feof会测试每次读操作(不论哪个读函数)是否到文件结束处。
如果调用者判断,那么系统(stdio.h)提供了一个宏EOF(-1)来判断文件是否结束,然而这种机制只适合ASCII文件,对于二进制使用这个来判断可能导致失败。

论坛徽章:
0
34 [报告]
发表于 2003-12-27 10:59 |只看该作者

c语言 关于文件的两个问题

[quote]原帖由 "蓝色键盘" 发表:
要使每个人都像lixforalpha就好了,每一步贴上了插图

我说说自己的看法

对于文件来说
从存储形式上来说,我们区分为ASCII码文件和二进制文件

谢看看这二者的区别:
ASCII码文件的每1个字节存储1个字符,

论坛徽章:
0
35 [报告]
发表于 2003-12-27 16:20 |只看该作者

c语言 关于文件的两个问题

原帖由 "蓝色键盘" 发表:
要使每个人都像lixforalpha就好了,每一步贴上了插图
我说说自己的看法
对于文件来说
从存储形式上来说,我们区分为ASCII码文件和二进制文件

见笑了!  

多谢回复!
不过看了之后,还提不出问题来,再仔细研究研究!

论坛徽章:
0
36 [报告]
发表于 2003-12-27 16:40 |只看该作者

c语言 关于文件的两个问题

经典错误,不过还没改对:while((c=fgetc(fp))!=EOF) fputc(c,fp1); 的c必须是int,否则结果就可能跟编译器实现相关了。因为不同的编译器默认的char是有符号的还是无符号的是不一样的,这也是因为标准没有规定。

对UNIX而言,没有文本文件和二进制文件之分,都是字节流。这个键盘说的对,只是不知既然这样说了,为什么又说“这种机制只适合ASCII文件,对于二进制使用这个来判断可能导致失败”?矛盾了,所以说错了。

论坛徽章:
0
37 [报告]
发表于 2003-12-27 17:17 |只看该作者

c语言 关于文件的两个问题

原帖由 "fieryfox"]c必须是int,[/b 发表:

..........


"int fgetc(FILE *fp)
功能:从fp所指向的文件当前位置读取单个字符
返回值: 正确,则返回读取的单个字符,错误,则返回EOF(-1)"

"如果其值在0-128之间,C语言规定也可以将其看成一个字符型常量"

自考《高级语言程序设计》P177  P13  ,这本书的代码有两处已知错误一个是这个,一个就是路径  "a:\tet\tet.dat"  它总是用\来表示

针对的平台不一样啊!三级网络 上机ucdos+ tc3,好在基础的东西都一样!不过也太落后了点儿

论坛徽章:
0
38 [报告]
发表于 2003-12-27 17:39 |只看该作者

c语言 关于文件的两个问题

int fgetc(FILE *)的原型应该是不分平台的。

论坛徽章:
0
39 [报告]
发表于 2003-12-27 17:49 |只看该作者

c语言 关于文件的两个问题

把"char c;" 改成"int c;"试试,因为EOF的数值比一个char型大

论坛徽章:
0
40 [报告]
发表于 2003-12-27 19:55 |只看该作者

c语言 关于文件的两个问题

原帖由 "fieryfox" 发表:
经典错误,不过还没改对:while((c=fgetc(fp))!=EOF) fputc(c,fp1); 的c必须是int,否则结果就可能跟编译器实现相关了。因为不同的编译器默认的char是有符号的还是无符号的是不一样的,这也是因为标准没有规定。

..........


这的确是个经典错误。

c 是个 int, 前面 flw 版主已经指出过这一点,请大家看仔细。

如果把 c 定义为 char,则读文件有可能意外终止,如果其中包含 0xff 字符。
如果把 c 定义为 uchar,则陷入死循环。编译器应该有警告。
如果把 c 定义为 int 则一切正常。

kernighan 说过,编程应该避免"surprise"。从字面上看,fgetc 返回的是 char,实际上却是个 int,这就是一个 "surprise",从而成为 fgetc 的一块暗礁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP