参考:
菜鸟教程
C 文件读写
打开文件
使用
fopen( )
函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型
FILE
的一个对象,类型
FILE
包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:
FILE *fopen( const char *filename, const char *mode );
filename
是字符串,用来命名文件,访问模式
mode
的值可以是下列值中的一个:
r
打开一个已有的文本文件,允许读取文件。
w
打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程- 序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a
打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+
打开一个文本文件,允许读写文件。
w+
打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+
打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
“rb”, “wb”, “ab”, “rb+”, “r+b”, “wb+”, “w+b”, “ab+”, “a+b”
关闭文件
为了关闭文件,请使用 fclose( ) 函数。函数的原型如下:
int fclose( FILE *fp );
如果成功关闭文件,
fclose( )
函数返回零,如果关闭文件时发生错误,函数返回
EOF
。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。
EOF
是一个定义在头文件
stdio.h
中的常量。
C
标准库提供了各种函数来按字符或者以固定长度字符串的形式读写文件。
写入文件
下面是把字符写入到流中的最简单的函数:
int fputc( int c, FILE *fp );
函数
fputc()
把参数
c
的字符值写入到
fp
所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回
EOF
。
您可以使用下面的函数来把一个以
null
结尾的字符串写入到流中:
int fputs( const char *s, FILE *fp );
函数
fputs()
把字符串
s
写入到
fp
所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回
EOF
。您也可以使用
int fprintf(FILE *fp,const char *format, ...);
函数把一个字符串写入到文件中。尝试下面的实例:
#include <stdio.h>
int main()
{
FILE *fp = NULL;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
读取文件
下面是从文件读取单个字符的最简单的函数:
int fgetc( FILE * fp );
fgetc()
函数从
fp
所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回
EOF
。下面的函数允许您从流中读取一个字符串:
char *fgets( char *buf, int n, FILE *fp );
函数
fgets()
从
fp
所指向的输入流中读取
n - 1
个字符。它会把读取的字符串复制到缓冲区
buf
,并在最后追加一个
null
字符来终止字符串。
如果这个函数在读取最后一个字符之前就遇到一个换行符
'\n'
或文件的末尾
EOF
,则只会返回读取到的字符,包括换行符。您也可以使用
int fscanf(FILE *fp, const char *format, ...);
函数来从文件中读取字符串,但是在遇到第一个空格和换行符时,它会停止读取。
二进制 I/O 函数
下面函数用于二进制输出:
C 库函数
c size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
从给定流
stream
读取数据到
ptr
所指向的数组中。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值
成功读取的元素总数会以
size_t
对象返回,
size_t
对象是一个整型数据类型。如果总数与
nmemb
参数不同,则可能发生了一个错误或者到达了文件末尾。
下面函数用于二进制输入:
C 库函数
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
把
ptr
所指向的数组中的数据写入到给定流
stream
中。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值
如果成功,该函数返回一个
size_t
对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与
nmemb
参数不同,则会显示一个错误。
定位流
C 库函数
int fseek(FILE *stream, long int offset, int whence)
设置流
stream
的文件位置为给定的偏移
offset
,参数
offset
意味着从给定的
whence
位置查找的字节数。
int fseek(FILE *stream, long int offset, int whence);
-
stream
– 这是指向
FILE
对象的指针,该
FILE
对象标识了流。 -
offset
– 这是相对
whence
的偏移量,以字节为单位。 -
whence
– 这是表示开始添加偏移
offset
的位置。它一般指定为下列常量之一:
SEEK_SET
文件的开头
SEEK_CUR
文件指针的当前位置
SEEK_END
文件的末尾
返回值
如果成功,则该函数返回零,否则返回非零值。