文件读写操作速成攻略

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,但是无妨,因为其他所有的循环操作都要放在此句话上面
}

对于文件的读写,有一个最为关键的部分是打开方式,只有确定打开方式,才能保证你的文件操作无误。
参考链接

posted on 2019-07-08 22:34  偷影子的人儿  阅读(7)  评论(0编辑  收藏  举报