文件操作 C语言

来源:互联网 发布:水经注软件破解版 编辑:程序博客网 时间:2024/06/04 18:26

我写了一个函数用来打开文件:
  myfopen(char *fiename,FILE *fp){
  fp=fopen(filename,"r");
}
可我这样调用的时候:
   FILE *infp;
   mafopen("filename.dat",infp);
 infp指针并没有正确设置,为什么?

  c语言的函数总是接收参数的副本,因此函数永远不能通过向参数赋值“放回”任何东西。
   对于这个例子,一种解决方法是让myfopen返回FILE*;
  FILE * myfopen(char *filename){
  FILE *fp=fopen(char * filename);
  return fp;
然后这样调用:
  FILE * infp;
  infp=myopen("filename.dat");
另外,也可以让myopen接受FILE*指针(FILE的指针的指针):
myopen(char * filename,FILE **fpp){
 FILE * fp=fopen(filename,"r");
*fpp=fp;
}
然后这样调用:
   FILE *infp;
  myopen("filename.dat",&infp);
}

连一个最简单的fopen调用都不成功!这个调用有什么问题?
  FIEL*fp=fopen(filename.‘r’);

问题在于fopen的mode参数必须是字符串,如"r",而不是字符'r'。


为什么我不能用完整路径名打开一个文件?这个调用总是失败:
 fopen("c:\newdir\file.dat","r");

你可能要重复那些反斜杠。

 

我想用fopen模式“r+”打开一个文件,读出一个字符串,修改后在写入,从而就地更新一个文件。可是这样不行。为什么?

确保在写操作之前先调用fseek,回到你准备覆盖的字符串的开始,况且在读写"+"模式下的读和写操作之间总是需要fseek或fflush,同时,记住改写同样数量的字符,而且在文本模式写改写可能会在改写处把文件长度截断,因而你可能需要报讯行长度。


文本和二进制输入输出有什么区别?

文本模式下,文件应该包含可答应的字符行(可能包括tab字符)。stdio库的例程(getc,putc和其他函数)完成c程序中的\n和底层操作的行结束符质检单额转换。因此读写文本文件的c程序无需考虑底层系统换行符的习惯。当c程序写入'\n'的时候,底层库会写入正确的换行符,而stdio库检测到行结束的时候,他也会向调用程序返回'\n'.
 而二进制方式下,数据在程序和文件之间读写的时候没有经过任何解释。

 文本方式的转换也会在读入的时候影响到文件表面上的大小。因为文本方式下读出和写入的字符不一定和文件中的字符完全相同,磁盘文件的大小也不一定和可以读出的字符数相等。而且,基于类似的原因,fseek和ftell处理的也不一定是从文件开始的纯的字节数。(严格的讲,fseek和ftell使用的偏移量根本不恩能够解释。ftell的返回值只能再用作fseek的参数,而fseek的参数也只能使用ftell的返回值)。
   二进制方式下,fseek和ftell的确使用纯字节偏移。但是,某些系统可能会在二进制文件的尾部添加一些空字符,用以补全一条记录。

0 0
原创粉丝点击