文件读写操作速成攻略
1. fopen
函数原型为: FILE *fopen(const char *filename, const char *mode)
功能:使用给定的模式 mode 打开 filename 所指向的文件
位置:C 标准库<stdio.h>中
打开正常:返回指向该流的文件指针 打开失败:返回 NULL
2.fclose
函数原型:int fclose( FILE *fp );
功能:关闭一个文件流
流成功关闭,fclose 返回 0 ,关闭失败,返回EOF(-1)
例子
int main(void)
{
FILE *fp = NULL;//赋空,好习惯
fp = fopen(F_PATH, "打开方式");
if (NULL == fp)//判断是否正常打开
return -1;
(文件读写操作)
fclose(fp);
fp = NULL; /* 最好赋空,否则会指向原打开文件地址 */
return 0;
}
3.fscanf
函数原型为 int fscanf(FILE * stream, const char * format, [argument…]);
从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
例子
FILE *fp;
while(!feof(fp))
{
fscanf(fp,"%s%d%lf",a,&b,&c);
//这里%s对应的a不需要加上取地址符号&,因为a为数组名称,其本身就表示该数组的首地址
printf("%s%d%lf",a,b,c)
}
4. fgetc()
函数原型:int fgetc(FILE *stream)
功能:
文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节
成功的话返回所读取的一个字节,到达文件末尾或发生读错误,则返回 EOF
例子
int main(void)
{
FILE *stream;
char string[ ] = "This is a test";
int ch;
stream = fopen("DUMMY.FIL", "w+"); //读写方式打开文件流
fwrite(string, strlen(string), 1, stream);// 将字符串写入文件
fseek(stream, 0, SEEK_SET);//回到文件头
do
{
ch = fgetc(stream);//读取一个字符
putc(ch);//打印字符
}
while (ch != EOF);//如果在文件尾部,则返回EOF
fclose(stream);
return 0;
}
5.fgets
函数原型:char *fgets(char *str, int n, FILE *stream);
函数功能:从指定的流中读取数据,每次读取一行。当读取(n-1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。
例子
int main()
{
FILE *fp;
char str[60];
fp = fopen("file.txt" , "r");
if(fp == NULL) {
perror("打开文件时发生错误");
return(-1);
}
if( fgets (str, 60, fp)!=NULL ) {
puts(str);
}
fclose(fp);
return(0);
}
每次只能读取n-1个字符,最后一个自动添加为‘\0’,换行符也会当做字符读入,如果读到的话。
6.fread
函数原型为:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
从给定流 stream 读取数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回 0。
例子
int main()
{
FILE *fp;
char c[] = "This is runoob";
char buffer[20];
fp = fopen("file.txt", "w+");
fwrite(c, strlen(c) + 1, 1, fp);
fseek(fp, 0, SEEK_SET);
fread(buffer, strlen(c)+1, 1, fp);
printf("%s\n", buffer);
fclose(fp);
return(0);
}
7.fprintf
函数原型为int fprintf( FILE *stream, const char *format, [ argument ]…)
功能:fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)
如果成功,则返回写入的字符总数,否则返回一个负数。
例子
int main()
{
FILE * fp;
fp = fopen ("file.txt", "w+");
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);
fclose(fp);
return(0);
}
8.fputc
函数原型:int fputc (int c, FILE *fp)
功能:将字符ch写到文件指针fp所指向的文件的当前写指针的位置
函数返回写入文件的字符的ASCII码值,出错时,返回EOF(-1)。当正确写入一个字符或一个字节的数据后,文件内部写指针会自动后移一个字节的位置。
例子
#include <stdio.h>
#include <string.h>
int main(void)
{
char msg[]="Hello world";
int i=0;
while(msg[i]&&(i<strlen(msg)))
{
fputc(msg[i],stdout);//标准输出文件,默认是屏幕文件
i++;
}
return 0;
}
9.fputs
函数原型:int fputs(const char *str, FILE *stream)
把字符串写入到指定的流 stream 中,但不包括空字符。
该函数返回一个非负值,如果发生错误则返回 EOF。
例子
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("file.txt", "w+");
fputs("这是 C 语言。", fp);
fputs("这是一种系统程序设计语言。", fp);
fclose(fp);
return(0);
}
10.fwrite
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
功能:功能是向指定的文件中写入若干数据块
如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。
#include <stdio.h>
struct mystruct
{
int i;
char cha;
};
int main(void)
{
FILE *stream;
struct mystruct s;
if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */
{
fprintf(stderr, "Cannot open output file.\n");
return 1;
}
s.i = 0;
s.cha = 'A';
fwrite(&s, sizeof(s), 1, stream); /* 写的struct文件*/
fclose(stream); /*关闭文件*/
return 0;
}
11.feof
函数原型:int feof(FILE *stream);
功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0(即,文件结束:返回非0值,文件未结束,返回0值)
int c;
c = fgetc(fp);
while(!feof(fp))
{
printf("%X\n", c);
c = fgetc(fp);//最后一个c的值为-1,但是无妨,因为其他所有的循环操作都要放在此句话上面
}
对于文件的读写,有一个最为关键的部分是打开方式,只有确定打开方式,才能保证你的文件操作无误。
参考链接