文件读写模式

r    打开一个已有的文本文件,允许读取文件。
w    打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a    打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+    打开一个文本文件,允许读写文件。
w+    打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+    打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

备注

读写模式

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

只有 r+ rb+ 可以在原文件上直接修改内容

二进制/字符 模式的区别:

  1. 字符模式:读: 遇到回车-换行(0D 0A),就会转换为换行符0A
  2. 字符模式:写:遇到换行符0A,就会转换为回车-换行(0D 0A)
  3. 二进制则读写保持原样
  4. fopen缺省以文本方式打开,文本文件是根据特殊字符EOF(0x1A)标志结束的,而不是文件长度。

小心:
当文件中有 0x1A时 文本模式就认为文件结束,直接退出

文件大小限制

  1. 当文件小于2G时,使用fseekftell可以获取文件的大小,必须是这两者搭配。
  2. 当文件大于4G时,使用_fseeki64_ftelli64
  3. 如果不确定自己操作的文件大小建议使用_fseeki64_ftelli64
  4. 这个两个函数的参数是一致的,通用。

写入文件

fputc

int fputc( int c, FILE *fp );
  1. 函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。
  2. 如果写入成功,它会返回写入的字符
  3. 如果发生错误,则会返回 EOF。

fputs

int fputs( const char *s, FILE *fp );
  1. 函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。
  2. 如果写入成功,它会返回一个非负值
  3. 如果发生错误,则会返回 EOF。

fprintf

  1. 可以使用 int fprintf(FILE fp,const char format, ...) 函数来写把一个字符串写入到文件中。
  2. fputs(s, f)在功能上等同于fprintf(f, "%s", s)

实例

#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);
}

读取文件

读取文件

fgetc

int fgetc( FILE * fp );
  1. fgetc() 函数从 fp 所指向的输入文件中读取一个字符。
  2. 返回值是读取的字符
  3. 如果发生错误则返回 EOF

fgets

char fgets( char buf, int n, FILE *fp );

  1. 函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符
  2. 它会把读取的字符串复制到缓冲区 buf
  3. 在最后追加一个 null 字符来终止字符串。
  4. 如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。

也可以使用 int fscanf(FILE fp, const char format, ...) 函数来从文件中读取字符串,但是在遇到第一个空格字符时,它会停止读取。

实例

    #include <stdio.h>
    
    int main()
    {
    FILE *fp = NULL;
    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);
    
    }

读取文件:

This is testing for fputs...
This is testing for fputs...

程序输出:

This
is testing for fprintf...
This is testing for fputs...

文件指针

fseek 可以移动文件指针到指定位置读,或插入写:

int fseek(FILE *stream, long offset, int whence);
  1. fseek 设置当前读写点到 以whence 为基准点的 offset 处
  2. whence 可以是 SEEK_SET(文件头),SEEK_CUR(当前点),SEEK_END(文件尾)

你可以定义一个文件指针 FILE *fp,当你打开一个文件时,文件指针指向开头,你要指到多少个字节,只要控制偏移量就好

例如, 相对当前位置往后移动一个字节:fseek(fp,1,SEEK_CUR); 中间的值就是偏移量

如果你要往前移动一个字节,直接改为负值就可以:fseek(fp,-1,SEEK_CUR)。

执行以下实例前,确保当前目录下 test.txt 文件已创建:

#include <stdio.h>
int main(){   
FILE *fp = NULL;
fp = fopen("test.txt", "r+");  // 确保 test.txt 文件已创建
fprintf(fp, "This is testing for fprintf...\n");   
fseek(fp, 10, SEEK_SET);
if (fputc(65,fp) == EOF) {
    printf("fputc fail");   
}   
fclose(fp);
}

执行结束后,打开 test.txt 文件:

This is teAting for fprintf...

注意:

  1. 只有用 r+ 模式打开文件才能插入内容
  2. w 或 w+ 模式都会清空掉原来文件的内容再来写
  3. a 或 a+ 模式即总会在文件最尾添加内容,哪怕用 fseek() 移动了文件指针位置。

二进制 I/O 函数

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

fread

声明

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

参数

  1. ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
  2. size -- 这是要读取的每个元素的大小,以字节为单位。
  3. nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
  4. stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。

返回值

  1. 成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型
  2. 如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

fwrite

声明

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

参数

  1. ptr -- 这是指向要被写入的元素数组的指针。
  2. size -- 这是要被写入的每个元素的大小,以字节为单位。
  3. nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
  4. stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

返回值

  1. 如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象时一个整型数据类型
  2. 如果该数字与 nmemb 参数不同,则会显示一个错误

实例

#include <stdio.h>
#include <string.h>
 
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, SEEK_SET, 0);
 
   /* 读取并显示数据 */
   fread(buffer, strlen(c)+1, 1, fp);
   printf("%s\n", buffer);
   fclose(fp);
   
   return(0);
}
Last modification:November 19, 2020
如果觉得我的文章对你有用,请随意赞赏