最近写的程序总是跟文件读写打交道,而且这个功能也十分重要,所以就查了一些资料,记录下来以便以后查看。
1.打开文件
一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。
fopen()函数,头文件:#include <stdio.h>
fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:
FILE * fopen(const char * path, const char * mode);
【参数】path为包含了路径的文件名,mode为文件打开方式。
FILE *fopen( const char * filename, const char * mode );
为了方便,上图是网上查到的,方式比较全,足够使用。可以看出模式后面带字母‘b’的都是处理的二进制文件。
2.关闭文件
int fclose( FILE *fp );
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。
3.写入文件
第一种:int fputc( int c, FILE *fp ); 或 int fputs( const char *s, FILE *fp ); 字符和字符串的区别;
第二种: int fprintf(FILE fp,const char format, ...);
函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。
函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。如下程序示例:
#include <stdio.h>
main()
{
FILE *fp;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
注意:“/tmp”这个目录一定要事先建好的,不然找不到test文件,fopen也不会自动构建tmp文件。
4.读取文件
第一种:int fgetc( FILE * fp ); 或者 char *fgets( char *buf, int n, FILE *fp );
第二种:int fscanf(FILE fp, const char format, ...) ;
fgetc() 函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF;
函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。
您也可以使用 int fscanf(FILE fp, const char format, ...) 函数来从文件中读取字符串,但是在遇到第一个空格字符时,它会停止读取;
如下程序示例:
#include <stdio.h>
main()
{
FILE *fp;
char buff[255];
fp = fopen("/tmp/test.txt", "r");
fscanf(fp, "%s", buff);
printf("1 : %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
运行结果:
1 : This
2: is testing for fprintf...
3: This is testing for fputs...
首先,fscanf() 方法只读取了 This,因为它在后边遇到了一个空格。其次,调用 fgets() 读取剩余的部分,直到行尾。最后,调用 fgets() 完整地读取第二行。
5.总结
以上内容源自网上查找的资料,本人只是参考整理,供自己和大家学习交流,如有错误,还望各位大牛不吝赐教!
附:
二进制和文本模式的区别:
在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。