C语言--文件操作

1.fopen函数是C语言标准库中的一个函数,用于打开一个文件并返回指向该文件的文件指针。它的函数原型如下:

FILE *fopen(const char *filename, const char *mode);

其中,filename 参数指向要打开的文件的文件名,mode 参数用于指定文件的访问模式,包括以下一些选项:

  • "r":只读模式,打开一个文件用于读取。
  • "w":写入模式,打开一个文件用于写入。如果文件已存在,则清空该文件;如果文件不存在,则创建该文件。
  • "a":追加模式,打开一个文件用于写入。如果文件已存在,则在文件末尾追加数据;如果文件不存在,则创建该文件。
  • "rb":二进制只读模式,打开一个二进制文件用于读取。
  • "wb":二进制写入模式,打开一个二进制文件用于写入。如果文件已存在,则清空该文件;如果文件不存在,则创建该文件。
  • "ab":二进制追加模式,打开一个二进制文件用于写入。如果文件已存在,则在文件末尾追加数据;如果文件不存在,则创建该文件。

如果文件打开成功,则 fopen() 函数返回一个指向 FILE 类型的文件指针,该指针可以用于后续文件操作函数,如 fread()、fwrite()、fgets()、fprintf() 等。如果文件打开失败,则返回 NULL。

2.fclose() 函数用于关闭一个文件。它的函数原型如下:

int fclose(FILE *stream);

其中,stream 参数是一个指向已被打开的文件的文件指针。如果文件成功关闭,则返回 0,否则返回 EOF。

在关闭文件之前,应该确保文件所有的读写操作都已完成。此外,关闭文件的目的还在于释放与该文件相关的资源,如缓冲区、文件描述符等。如果不关闭文件,可能会造成资源泄露和文件损坏等问题。

示例代码:

#include int main() { FILE *fp = fopen("test.txt", "w"); if(fp == NULL) { printf("Failed to open file.\n"); return 1; } fputs("Hello, World!", fp); fclose(fp); return 0; }

上述代码首先打开了一个名为 test.txt 的文件,然后向其中写入了一句话“Hello, World!”,最后使用 fclose() 函数关闭文件。

3.fscanf() 函数是 C 语言标准库中用于读取文件的函数,它的函数原型如下:

int fscanf(FILE *stream, const char *format, ...);

其中,stream 参数表示要读取的文件流;format 参数表示格式字符串,用于指定要读取的数据类型及其存放地址;省略号表示要读取的数据的具体存放地址。

fscanf() 函数根据 format 字符串的约定从文件中读取一定格式的数据,读入的数据会根据格式说明符的类型与顺序转化后存放到对应的参数变量中。

下面是一些格式说明符的使用方法:

  • %d:以十进制的格式读取一个整数;
  • %f:以浮点数的格式读取一个实数;
  • %s:以字符串格式读取一个字符串;
  • %ld:以长整型格式读取一个长整数;
  • %lf:以双精度浮点数的格式读取一个实数。

fscanf() 函数会在读取数据时自动忽略输入流中的空格、制表符和换行符等空白符。但需要注意的是,fscanf() 函数的读取是有可能出现错误的,因此在使用时需要对返回值进行检查,判断读取是否成功。

示例代码:

#include int main() { FILE *fp = NULL; char str[100]; int num; float f; fp = fopen("sample.txt", "r"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } fscanf(fp, "%s%d%f", str, &num, &f); printf("Read string: %s\n", str); printf("Read integer: %d\n", num); printf("Read floating point number: %f\n", f); fclose(fp); return 0; }

上述代码通过 fscanf() 函数从文件中读取一个字符串、一个整数和一个浮点数,然后输出读取到的值。

4.fprintf() 是 C 语言中的一个函数,用于将格式化的输出写入到文件中。它的函数原型如下:

int fprintf(FILE *stream, const char *format, ...);

其中,stream 是一个指向已打开的文件的指针,format 字符串用于格式化输出,省略号后面是需要写入文件的变量或参数。

fprintf() 函数的格式和 printf() 函数非常类似,但它的第一个参数是一个文件指针而不是标准输出流 stdout。在使用 fprintf() 函数之前,必须使用 fopen() 函数以指定文件名和访问模式来打开一个文件。

下面是一个简单的示例程序:

#include #include int main() { FILE *fp; // 声明文件指针 int num1 = 100, num2 = 200; fp = fopen("output.txt", "w"); // 创建一个名为 output.txt 的文件,并以写入模式打开它 if (fp == NULL) { printf("Failed to open file.\n"); exit(1); } fprintf(fp, "num1 = %d\n", num1); fprintf(fp, "num2 = %d\n", num2); fclose(fp); return 0; }

上述程序中,我们打开了一个名为 output.txt 的文件,并使用 fprintf() 函数向该文件写入了两个整数变量 num1 和 num2。最后,我们使用 fclose() 函数关闭文件,并返回 0 表示程序运行成功。

5.fgetc() 函数是 C 语言标准库提供的读取文件的函数。它的函数原型为:

int fgetc(FILE *stream);

它的参数 stream 表示要读取的文件,返回值表示读取的字符。

fgetc() 函数从 stream 所指向的文件中读取一个字符。若读取成功则返回读取到的字符,若已到达文件末尾或者出错则返回 EOF。

示例代码:

#include int main() { FILE *fp; char c; fp = fopen("test.txt", "r"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } while ((c = fgetc(fp)) != EOF) putchar(c); fclose(fp); return 0; }

以上代码使用 fopen() 打开一个名为 test.txt 的文本文件,并使用 fgetc() 函数以字符为单位读取其中的内容,直到文件末尾,最后关闭文件。在循环中,每次循环都会把读取到的字符打印出来。

6.fputc() 函数是 C 语言标准库提供的写入文件的函数,它的函数原型为:

int fputc(int c, FILE *stream);

它的第一个参数 c 是要写入的字符的 ASCII 码值,第二个参数 stream 表示要写入的文件。

fputc() 函数将 c 所对应的字符写入到 stream 所指的文件。如果写入成功,则返回写入的字符;否则返回 EOF。

示例代码:

#include int main() { FILE *fp; char c; fp = fopen("test.txt", "w"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } for (c = 'A'; c <= 'Z'; c++) fputc(c, fp); fclose(fp); return 0; }

以上代码使用 fopen() 函数创建一个名为 test.txt 的文本文件,并使用 fputc() 函数以字符为单位向其中写入从大写字母 A 到大写字母 Z 的所有字母,最后关闭文件。

需要注意的是,当要写入的文件已经存在时,fopen() 函数的打开模式应该选择“写入模式”("w")或“追加模式”("a"),否则原先的内容将被覆盖。

7.fgets() 函数是 C 语言标准库提供的读取文件的函数,它的函数原型为:

char *fgets(char *str, int n, FILE *stream);

它的参数 str 是一个字符指针,指向一个字符数组。表示要存储读取的字符的字符串;n 表示要读取的最大字符数(包括空字符 \0);stream 表示要读入的文件流指针。如果读取成功,则返回读取字符的字符串指针,如果到达文件结尾或者出错,则返回 NULL。

示例代码:

#include int main() { FILE *fp; char str[100]; fp = fopen("test.txt", "r"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } while (fgets(str, 100, fp) != NULL) printf("%s", str); fclose(fp); fp=NULL; return 0; }

以上代码使用 fopen() 函数打开一个名为 test.txt 的文本文件,并使用 fgets() 函数以行为单位读取其中的内容,直到文件结尾或者出错,将读取到的每一行字符串打印出来。其中,fgets() 函数每次最多读取 100 个字符,并将读取到的字符串保存在 str 数组中,最后将它打印出来。

需要注意的是,fgets() 函数在读取每一行时,会将行末的换行符('\n')也读取进来并存储在 str 数组中,因此在输出时,需要注意将其去掉,可以使用 strchr() 函数来查找第一个出现的换行符。另外,在使用 fgets() 函数时,也需要注意缓冲区大小应该足够存放读取到的字符串。

fgets函数在读取字符时,会将包括换行符(\n)在内的所有字符都读取进来,并占用读取数量 n 中的一个位置。

当 fgets 函数读取字符时,它会按照以下规则操作:

  • 如果遇到换行符 \n,则将其放入读取的字符串中,并在其后添加一个字符串结束符 \0。
  • 如果读取的字符数量达到了 n-1(即剩余的可读字符数为 1),则会停止读取,并在末尾加上字符串结束符 \0。

这意味着如果你将 n 设定为 10,那么 fgets 最多会读取 9 个字符(包括换行符和字符串结束符),并将其存储在字符串中。

因此,确保设置适当的数组大小和读取字符数 n,以便存储所需的数据和结束符。如果字符数量超过了设定的大小,fgets 就会截断输入并存储尽可能多的字符。

8.fputs() 函数是 C 语言标准库提供的写入文件的函数,它的函数原型为:

int fputs(const char *str, FILE *stream);

它的第一个参数 str 是要写入的字符串地址,第二个参数 stream 表示要写入的文件。如果写入成功,则返回一个非负整数,否则返回 EOF。

示例代码:

#include int main() { FILE *fp; char str[] = "Hello, World!"; fp = fopen("test.txt", "w"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } if (fputs(str, fp) == EOF) { printf("Failed to write to file.\n"); return 1; } fclose(fp); return 0; }

以上代码使用 fopen() 函数创建一个名为 test.txt 的文本文件,并使用 fputs() 函数向其中写入一个字符串。需要注意的是,当要写入的文件已经存在时,fopen() 函数的打开模式应该选择“写入模式”("w")或“追加模式”("a"),否则原先的内容将被覆盖。在使用 fputs() 函数时,如果写入失败,则应该返回错误。最后,需要使用 fclose() 函数关闭文件。

需要注意的是,fputs() 函数会在字符串末尾添加一个空字符(\0),但是不会自动添加换行符,如果需要在每行末尾添加换行符,需要手动在字符串末尾添加 '\n'。

9.feof() 函数是 C 语言标准库提供的判断文件结尾的函数,它的函数原型为:

int feof(FILE *stream);

它的参数 stream 表示要判断是否已经到达文件结尾的文件流指针。如果已经到达文件结尾,则返回非 0 值,否则返回 0。

示例代码:

#include int main() { FILE *fp; int c; fp = fopen("test.txt", "r"); if (fp == NULL) { printf("Failed to open file.\n"); return 1; } while (!feof(fp)) { c = fgetc(fp); if (c == EOF) break; putchar(c); } fclose(fp); return 0; }

以上代码使用 fopen() 函数打开一个名为 test.txt 的文本文件,并使用 fgetc() 函数以字符为单位读取其中的内容,直到文件结尾或者出错。feof() 函数会在 fgetc() 函数返回 EOF(即已经到达文件结尾)后返回非 0 值,因此可以利用这个特性来检测文件是否已经读取完毕。需要注意的是,在使用 feof() 函数时,应该将其放在 fgetc() 函数的下一行,否则会多读取一次文件。

需要注意的是,feof() 函数只能判断上一次读取是否已经到达文件结尾,而不能判断下一次读取是否会到达文件结尾。因此,在使用 feof() 函数判断文件是否已经结束时,还需要在读取文件前或者读取结束后进行一次判断。

10.流

C语言--文件操作_第1张图片

C语言--文件操作_第2张图片

在计算机科学中,流(stream)是一种数据传输方式,它用于将数据从源传送到目的地。因此,流经常被用来在程序之间或者程序内部传输数据。在 C 语言中,输入输出(I/O)流是常用的流操作类型。

流分为两种类型:输入流和输出流。输入流(input stream)是从某个源(如文件、标准输入等)读取数据的流,而输出流(output stream)是将数据写入到某个目标(如文件、标准输出等)的流。输入输出流可以实现对文件或者其他设备的读写操作。

输入输出流可以用 FILE 类型的指针表示。在打开文件时,可以使用 fopen() 函数来获取文件指针,然后通过这个指针来读写文件。例如:

FILE *fp; char buffer[100]; // 打开文件 fp = fopen("file.txt", "r"); // 读取文件 fgets(buffer, 100, fp); // 关闭文件 fclose(fp);

在这段代码中,我们使用 fopen() 函数打开名为 file.txt 的文本文件,并获得文件指针 fp,然后使用 fgets() 函数从文件中读取一行数据,并保存在 buffer 数组中。最后,我们使用 fclose() 函数关闭文件。

在 C 语言中,也可以使用标准流(如标准输入输出流)来进行输入输出操作。例如:

int c; // 从标准输入读取字符 c = getchar(); // 向标准输出写入字符 putchar(c);

在这段代码中,我们使用标准输入流函数 getchar() 读取一个字符,并使用标准输出流函数 putchar() 将这个字符输出到标准输出流(通常是控制台)。需要注意的是,标准输入流和标准输出流在程序启动时就已经打开,因此在使用时无需先打开和关闭。

流的发明是为了提供一种抽象的数据传输方式,它可以使程序更容易编写、更通用。流也为输入输出提供了一致的方式,可以在程序内部或者程序之间传输数据,例如从键盘输入和屏幕输出、从文件读取和写入到文件等等,使得程序员不必去关注实际的物理位置或通信方式。

使用流还有以下好处:

  1. 统一抽象。使用流可以将不同类型的输入/输出(如文件、控制台、网络、内存等)抽象为一致的操作,使得操作更为通用和简单。
  1. 可以对流进行标准化。操作系统和编程语言通常都定义了标准 I/O 流(如 stdin、stdout、stderr 等),使得程序员可以更方便地进行输入输出操作。
  1. 更好的性能和可靠性。流的实现通常会采用缓存机制,使得数据能够更高效地处理,提高程序的性能。同时,流的错误处理机制也能够使程序更鲁棒和可靠。
  1. 更好的移植性。使用流可以将程序从一个平台移植到另一个平台,因为输入输出的方式都是一致的。

总之,流的发明使得计算机程序的输入输出更加方便、高效、统一,提供了一种抽象的操作方式,可以使程序员更加专注于业务逻辑的实现而不是底层细节的处理,从而提高了程序的可维护性和可重用性。

11.在 C 语言中,fclose() 函数被用于关闭文件。它接受一个指向 FILE 结构的指针作为参数,并将这个指针所指向的文件关闭,释放文件使用的资源。fclose() 函数并不会自动将指针置空,因此需要手动将指针赋值为 NULL。

在程序的其他部分,如果没有先将文件指针置空,可能会导致指针在程序的其他地方被误用,导致程序出现一些错误。特别是在使用动态分配内存的情况下,如果没有将指针置空,可能会导致程序在释放内存时出错,这可能导致内存泄漏或者程序崩溃。

因此,将指针置空是一种良好的编程习惯,可以帮助程序员避免一些潜在的错误。在 C 语言标准中,将指针赋值为 NULL 被视为一种释放指针所引用的空间的标准做法。一般情况下,这个做法不仅可以避免程序出错,还可以使得代码更加简洁易懂,方便维护。

以下是一个例子:

#include int main() { FILE *fp = fopen("file.txt", "r"); // 打开文件 if (fp == NULL) { printf("Failed to open file\n"); return 1; } // 从文件中读取数据 char buffer[10]; fgets(buffer, sizeof(buffer), fp); printf("Read buffer: %s\n", buffer); fclose(fp); // 关闭文件 fp = NULL; // 将文件指针置空 // 继续使用文件指针可能会导致程序出错,因此需要检查 if (fp != NULL) { printf("File pointer is not NULL after fclose()\n"); return 1; } return 0; }

这个例子中,我们打开了一个名为 file.txt 的文件,并从中读取了一定大小的数据。在结束文件操作后,我们使用 fclose() 函数关闭了文件,并将指针置空。

在继续使用文件指针之前,我们对其进行了检查,以确保文件指针已经被清空。否则,如果文件指针仍然引用先前打开的文件,可能会导致程序在后续处理时出现错误。

注意,将文件指针置空并不会清空文件中已经读取或者写入的数据,而是只是将指针所引用的文件关闭。

12.fwrite 是一个用于将数据块写入文件的函数。它的基本语法如下:

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

其中:

  • ptr 是指向要写入的数据块的指针。
  • size 是每个数据项的大小(以字节为单位)。
  • count 是要写入的数据项的数量。
  • stream 是指向要写入数据的文件流的指针。

fwrite 函数按照以下步骤将数据写入文件:

  1. 检查要写入的数据项

count,并将每个数据项的大小

size 与文件指针的当前位置相乘,得到要写入的总字节数。

count 个数据项从

ptr 所指向的内存中写入到文件流

stream 中。

  1. 文件指针向前移动写入的总字节数。

fwrite 函数返回成功写入的数据项数量,如果返回的数据项数量与 count 不一致,可能表示写入失败。

下面是一个使用 fwrite 函数将数据写入文件的例子:

#include int main() { int data[] = {1, 2, 3, 4, 5}; FILE *file = fopen("data.bin", "wb"); // 以二进制写模式打开文件 if (file == NULL) { printf("无法打开文件!\n"); return -1; } size_t num_items = sizeof(data) / sizeof(int); size_t items_written = fwrite(data, sizeof(int), num_items, file); if (items_written != num_items) { printf("写入失败!\n"); return -1; } fclose(file); printf("数据写入成功!\n"); return 0; }

在这个例子中,我们定义了一个整数数组 data,然后使用 fwrite 函数将整数数据写入二进制文件 "data.bin"。我们计算数组 data 中元素的数量,并将其传递给 fwrite 函数,同时指定每个数据项的大小为 sizeof(int)。函数成功写入所有数据项后,我们关闭文件并输出成功的消息。

需要注意的是,fwrite 函数将数据块写入文件时,并没有对数据进行特定的格式转换或添加结束符。因此,在读取文件时,需要根据特定的格式和数据大小来解析和处理读取的数据。

13. fread 是一个用于从文件中读取数据块的函数。它的基本语法如下:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

其中:

  • ptr 是指向接收读取数据的内存块的指针。
  • size 是每个数据项的大小(以字节为单位)。
  • count 是要读取的数据项的数量。
  • stream 是指向要读取数据的文件流的指针。

fread 函数按照以下步骤从文件中读取数据:

  1. 检查要读取的数据项 count,并将每个数据项的大小 size 与文件指针的当前位置相乘,得到要读取的总字节数。
  2. 从文件流 stream 读取 count 个数据项到 ptr 所指向的内存中。
  3. 文件指针向前移动读取的总字节数。

fread 函数返回成功读取的数据项数量,如果返回的数据项数量与 count 不一致,则可能表示读取失败。

下面是一个使用 fread 函数从文件中读取数据的例子:

#include int main() { int data[5]; FILE *file = fopen("data.bin", "rb"); // 以二进制读模式打开文件 if (file == NULL) { printf("无法打开文件!\n"); return -1; } size_t num_items = sizeof(data) / sizeof(int); size_t items_read = fread(data, sizeof(int), num_items, file); if (items_read != num_items) { printf("读取失败!\n"); return -1; } fclose(file); printf("从文件中读取的数据:\n"); for (int i = 0; i < num_items; i++) { printf("%d ", data[i]); } return 0; }

在这个例子中,我们定义了一个整数数组 data,然后使用 fread 函数从二进制文件 "data.bin" 中读取整数数据。我们计算数组 data 中元素的数量,并将其传递给 fread 函数,同时指定每个数据项的大小为 sizeof(int)。函数成功读取所有数据项后,我们关闭文件,并输出读取的数据。

需要注意的是,fread 函数从文件中读取数据块时,并没有对数据进行特定的格式转换或添加结束符。因此,在读取数据后,需要根据特定的数据格式来解析和处理读取的数据。

总结

下面是 fscanf、fprintf、fgets、fputs、fwrite、fread 函数的用途和基本语法的概述:

  1. fscanf:用于从文件读取格式化数据。
    • 用途:从文件中按照指定格式读取数据,并将其存储到指定的变量中。
    • 基本语法:

int fscanf(FILE *stream, const char *format, ...);

  1. fprintf:用于向文件写入格式化数据。
    • 用途:按照指定格式将数据写入文件。
    • 基本语法:

int fprintf(FILE *stream, const char *format, ...);

  1. fgets:用于从文件读取一行字符串。
    • 用途:从文件中读取包括换行符在内的一行字符串,并将其存储到指定的字符数组中。
    • 基本语法:

char *fgets(char *str, int size, FILE *stream);

  1. fputs:用于向文件写入字符串。
    • 用途:将字符串写入文件,包括其中的空格和换行符。
    • 基本语法:

int fputs(const char *str, FILE *stream);

  1. fwrite:用于将数据块写入文件。
    • 用途:将指定大小和数量的数据块写入文件。
    • 基本语法:

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

  1. fread:用于从文件读取数据块。
    • 用途:从文件中读取指定大小和数量的数据块。
    • 基本语法:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

这些函数在 C 语言中常用于文件的读取和写入操作。根据具体的需求,你可以选择适当的函数来读取和写入文件中的数据。请注意,以上函数的返回值可以用于判断读取或写入操作是否成功。

14.sprintf 和 sscanf 是 C 语言中用于格式化字符串的函数,其用法如下:

  1. sprintf

函数:

    • 用途:将格式化的数据写入字符串中。
    • 基本语法:

int sprintf(char *str, const char *format, ...);

    • 参数:
      • str:目标字符串的指针,用于存储格式化后的数据。
      • format:格式字符串,指定输出的格式。
      • ...:可变数量的参数,用于提供格式字符串中所需的数据。
    • 返回值:成功时返回写入到字符串中的字符数量,失败时返回负数。

示例:

char buffer[100]; int num = 10; sprintf(buffer, "The number is %d", num); printf("%s", buffer); // 输出:The number is 10

  1. sscanf

函数:

    • 用途:从字符串中按照指定格式读取数据。
    • 基本语法:

int sscanf(const char *str, const char *format, ...);

    • 参数:
      • str:源字符串,从中读取数据。
      • format:格式字符串,指定要读取的数据的格式。
      • ...:可变数量的参数,用于提供接收数据的变量。
    • 返回值:成功时返回成功匹配并解析的参数数量,失败时返回负数。

示例:

char data[] = "John 25"; char name[20]; int age; sscanf(data, "%s %d", name, &age); printf("Name: %s, Age: %d", name, age); // 输出:Name: John, Age: 25

通过使用 sprintf 和 sscanf 函数,你可以方便地将数据格式化为字符串或从字符串中解析出数据。在使用这些函数时,请确保提供正确的格式字符串和参数,以避免潜在的错误或未定义行为。

C语言--文件操作_第3张图片

s是一个结构体类型的变量,但是用sprintf函数就把这样的一个结构体类型变量转换成了字符串

C语言--文件操作_第4张图片

利用sscanf函数就可以把字符串还原成结构体数据 ,因为现在buf里面存储着刚才sprintf写入的数据,而且是字符串类型的,现在要把这个字符串类型的数据按照我们想要的格式读取出来,就用sscanf,

C语言--文件操作_第5张图片

15. fseek 是一个文件定位函数,它用于在文件中改变当前的读写位置。通过使用 fseek 函数,可以将文件指针移动到文件中的不同位置,从而实现对文件的随机访问。具体地说,fseek 可以用于设置文件指针的偏移量,该偏移量是相对于特定的参考位置(如文件开头、当前位置或文件末尾)计算得出的。

fseek 的函数原型如下:

int fseek(FILE *stream, long offset, int origin);

它的参数含义如下:

  • stream:要定位的文件指针。
  • offset:偏移量,即要移动的字节数。
  • origin:参考位置,即起始点。可以是以下常量之一:
    • SEEK_SET:从文件开头开始计算偏移量(相对于文件开头)。
    • SEEK_CUR:从当前位置开始计算偏移量(相对于当前位置)。
    • SEEK_END:从文件末尾开始计算偏移量(相对于文件末尾)。

fseek 函数会将文件指针移动到由 offset 和 origin 参数确定的位置。它返回 0 如果成功移动文件指针,返回非零值(通常是 -1)表示移动失败。

以下是一个示例,展示了如何使用 fseek 在文件中定位并读取数据:

#include int main() { FILE *file = fopen("data.txt", "r"); if (file == NULL) { printf("无法打开文件\n"); return 1; } // 将文件指针移动到文件末尾 fseek(file, 0, SEEK_END); // 获取当前文件指针的位置(相对于文件开头) long file_size = ftell(file); printf("文件大小:%ld 字节\n", file_size); fclose(file); return 0; }

上述示例中,我们打开了一个名为 "data.txt" 的文本文件,并使用 fseek 函数将文件指针移动到文件末尾。然后,使用 ftell 函数获取当前文件指针的位置(即文件大小),并将其打印出来。

16.ftell 是一个文件位置函数,用于获取当前文件指针相对于文件开头的偏移量(即文件位置)。ftell 函数用于告知当前文件指针在文件中的位置。

ftell 的函数原型如下:

long ftell(FILE *stream);

它的参数是要获取位置的文件指针 stream。

ftell 函数返回一个 long 类型的值,表示当前文件指针相对于文件开头的偏移量。如果获取位置成功,返回非负值;如果发生错误,返回 -1L。

以下是一个示例,展示了如何使用 ftell 获取文件中的当前位置:

#include int main() { FILE *file = fopen("data.txt", "r"); if (file == NULL) { printf("无法打开文件\n"); return 1; } // 将文件指针移动到文件末尾 fseek(file, 0, SEEK_END); // 获取当前文件指针的位置(相对于文件开头) long position = ftell(file); printf("当前文件位置:%ld\n", position); fclose(file); return 0; }

上述示例中,我们打开了一个名为 "data.txt" 的文本文件,并使用 fseek 函数将文件指针移动到文件末尾。然后,使用 ftell 函数获取当前文件指针相对于文件开头的偏移量,并将其打印出来。

17.rewind 是一个文件定位函数,用于将文件指针重新设置到文件开头。也就是说,它可以用于将文件的当前读写位置重新设置为文件的起始位置。

rewind 的函数原型如下:

void rewind(FILE *stream);

它接受一个指向文件的指针 stream。

rewind 函数会将文件指针移动到文件的起始位置,相当于使用 fseek(stream, 0L, SEEK_SET) 将文件指针设置为文件开头。

以下是一个示例,展示了如何使用 rewind 将文件指针重置到文件开头:

#include int main() { FILE *file = fopen("data.txt", "r"); if (file == NULL) { printf("无法打开文件\n"); return 1; } // 将文件指针重置到文件开头 rewind(file); // 从文件中读取数据并进行处理 char ch; while ((ch = fgetc(file)) != EOF) { // 处理文件内容 } fclose(file); return 0; }

上述示例中,我们打开了一个名为 "data.txt" 的文本文件。然后,使用 rewind 函数将文件指针重置到文件开头,以便从头开始读取文件中的数据。

需要注意的是,rewind 函数没有返回值,它只是改变了文件指针的位置。在实际使用中,需要确保文件已经打开且操作有效,以避免出现错误。

18.

C语言--文件操作_第6张图片

19.读写文件

C语言--文件操作_第7张图片

想要把test.txt(简称文件一)中的内容拷贝一份放到另一个文件test2.txt(简称文件二)中去,思路就是从文件一中读,同时往文件二中写,不管是读还是写,都要先把文件打开,读文件需要读文件一,因此创建FILE*pfread并初始化为fopen(“test.txt”,“r”);表示以读的形式打开文件一,返回的是指向文件一的文件指针,并赋给fpread,既然打开文件就要判断是否打开成功。往第二个文件中写,因此创建FILE*pfwrite并初始化为fopen(“test2.txt”,“w”),表示以写的形式打开文件二并返回指向文件二的文件指针赋给pfwrite,打开文件要判断是否打开成功,因为当文件二打开失败的时候文件一已经打开成功了,不然就走不到这个if语句了,因此首先要把文件一关掉,因为电脑能同时打开的文件是有限的,不用的文件就要关闭。若两个文件都成功打开,则开始读写文件,读写文件是依赖于fgetc和fputc两个函数的配合,利用fgetc从文件一中获取字符同时返回他的ASCLL码值并赋给ch,如果ch不是EOF,则表示还没有读完文件一,那就进入while循环,把读到的内容也就是现在ch里面的内容也即某个字符的ASCLL码值写入pfwrite指向的文件也即文件二。这样每读一个字符就写入一个字符,最终就能把文件一中的内容全部拷贝到文件二中去。

20.

C语言--文件操作_第8张图片

C语言--文件操作_第9张图片

文件缓冲区(File Buffer)是计算机系统中用于临时存储文件数据的内存区域。当打开或操作一个文件时,数据可以从硬盘读取到文件缓冲区中进行处理,或者从文件缓冲区写入到硬盘中进行存储。

文件缓冲区的意义主要体现在以下几个方面:

  1. 提高性能:由于硬盘的读写速度相对较慢,而内存的读写速度较快,使用文件缓冲区可以减少对硬盘的频繁读写操作,提高读写性能。
  1. 缓冲机制:文件缓冲区可以作为中间的数据缓冲,使得文件的读取和写入可以按块进行,减少了每次读取和写入的系统调用,提高了系统效率。
  1. 减少硬盘访问:通过将数据存储在文件缓冲区中,可以减少对硬盘的直接访问次数,降低了硬盘的磁头移动和寻道时间,延长了硬盘的使用寿命。
  1. 提供灵活操作:文件缓冲区可以对数据进行缓存、修改、重新排序等操作,使得文件的读写更加灵活和高效。

总之,文件缓冲区通过提高读写性能、缓冲机制、减少硬盘访问以及提供灵活操作等方面的优势,增强了系统对文件数据的处理能力,提高了系统的整体性能。

你可能感兴趣的:(c语言,c++)