C- fread() fwrite()

2023-10-25 18:30
文章标签 fread fwrite

本文主要是介绍C- fread() fwrite(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

fread()

fread() 是 C 语言中的标准库函数,用于从文件或流中读取数据。它是一个非常强大且通用的函数,经常用于读取二进制文件,但也可以用于读取文本文件。

函数原型:

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

参数:

  1. ptr: 一个指向内存的指针,该内存将存储从文件中读取的数据。通常,这是一个指向大型缓冲区或结构的指针。
  2. size: 要读取的每个数据项的大小(以字节为单位)。
  3. count: 要读取的数据项数量。
  4. stream: 一个指向 FILE 的指针,表示要从中读取数据的文件或流。

返回值:

  • 返回实际读取的数据项数。如果出现错误或到达文件末尾,该数字可能小于 count。特别地,如果遇到文件末尾或错误,fread() 可能返回一个小于 count 的值。

错误:

  • 如果发生错误,可以使用 ferror() 函数来检查。
  • 使用 feof() 可以检查是否已到达文件的末尾。

示例:

以下是一个示例,展示如何使用 fread() 从一个二进制文件中读取整数:

#include <stdio.h>int main() {FILE *file;int buffer[10]; // 数组,用于存储从文件中读取的整数size_t n;file = fopen("data.bin", "rb");if (file == NULL) {perror("Failed to open file");return 1;}n = fread(buffer, sizeof(int), 10, file); // 尝试读取10个整数for (size_t i = 0; i < n; i++) {printf("Read integer: %d\n", buffer[i]);}fclose(file);return 0;
}

在上面的示例中,我们打开了一个名为 data.bin 的二进制文件,并尝试从中读取 10 个整数。然后,我们打印出实际读取的整数。

注意:当使用 fread()fwrite() 等函数进行文件 I/O 操作时,通常推荐以二进制模式(如 “rb” 或 “wb”)打开文件,尤其是在跨平台的代码中,以避免任何潜在的换行符转换问题。

fwrite()

fwrite() 是 C 语言标准库中的一个函数,用于将数据写入文件或流。它通常用于写入二进制文件,但也可以用于写入文本文件。与 fread() 相似,它是用于文件I/O的底层函数,可以用来写入各种类型的数据。

函数原型:

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

参数:

  1. ptr: 一个指向要写入文件的数据的指针。
  2. size: 每个数据项的大小(以字节为单位)。
  3. count: 要写入的数据项数量。
  4. stream: 一个指向 FILE 的指针,表示要将数据写入的文件或流。

返回值:

  • 返回实际写入的数据项数。如果这个数字小于 count,则表示可能发生了错误。

示例:

以下是一个示例,展示如何使用 fwrite() 将整数数组写入一个二进制文件:

#include <stdio.h>int main() {FILE *file;int data[5] = {1, 2, 3, 4, 5};file = fopen("data.bin", "wb");if (file == NULL) {perror("Failed to open file");return 1;}size_t n = fwrite(data, sizeof(int), 5, file);if (n != 5) {printf("Error writing to file.\n");fclose(file);return 2;}printf("Successfully wrote %zu items to the file.\n", n);fclose(file);return 0;
}

在上述示例中,我们打开了一个名为 data.bin 的二进制文件(或创建了该文件,如果它不存在的话),然后尝试向其中写入一个整数数组。完成写入后,我们输出写入的数据项数。

注意:与 fread() 一样,当使用 fwrite() 进行文件 I/O 操作时,推荐以二进制模式(例如 “wb”)打开文件,特别是在跨平台代码中,以避免潜在的换行符转换问题。

综合案例

1、二进制文件读写

让我们考虑一个场景,其中有一个包含学生信息的结构体,并且我们希望将这些学生信息保存到一个二进制文件中,然后再从该文件中读取这些信息。

#include <stdio.h>
#include <string.h>#define FILENAME "students.bin"
#define MAX_NAME 100typedef struct {char name[MAX_NAME];int age;float gpa;
} Student;void saveStudentToFile(const Student *student) {FILE *file = fopen(FILENAME, "wb");if (!file) {perror("Failed to open file for writing");return;}if (fwrite(student, sizeof(Student), 1, file) != 1) {printf("Error writing to file.\n");}fclose(file);
}void readStudentFromFile(Student *student) {FILE *file = fopen(FILENAME, "rb");if (!file) {perror("Failed to open file for reading");return;}if (fread(student, sizeof(Student), 1, file) != 1) {printf("Error reading from file.\n");}fclose(file);
}int main() {Student s1 = {"Alice", 20, 3.5};saveStudentToFile(&s1);Student s2;readStudentFromFile(&s2);printf("Name: %s\nAge: %d\nGPA: %.2f\n", s2.name, s2.age, s2.gpa);return 0;
}

在上述程序中:

  1. 我们定义了一个名为 Student 的结构体,用于存储学生的 nameagegpa
  2. saveStudentToFile 函数接收一个 Student 结构体的指针,并将其内容写入一个名为 “students.bin” 的二进制文件。
  3. readStudentFromFile 函数读取 “students.bin” 文件的内容并将其填充到提供的 Student 结构体中。
  4. main 函数中,我们创建了一个名为 s1Student 结构体实例,并保存它。然后我们创建了一个名为 s2 的空的 Student 结构体,并从文件中填充其内容。最后,我们打印出从文件中读取的学生信息。

程序运行结果如下:

Name: Alice
Age: 20
GPA: 3.50

这个示例展示了如何使用 fread()fwrite() 进行基本的文件 I/O,特别是用于保存和读取结构体数据。

2、文本文件读写

当然,文本文件的读写与二进制文件有所不同。文本文件通常使用诸如 fprintf()fscanf()fgets()fputs() 之类的函数。这些函数为我们提供了更高级的文本处理能力。

下面的示例演示了如何将学生的信息写入文本文件,并从文本文件中读取它:

#include <stdio.h>
#include <string.h>#define FILENAME "students.txt"
#define MAX_NAME 100typedef struct {char name[MAX_NAME];int age;float gpa;
} Student;void saveStudentToFile(const Student *student) {FILE *file = fopen(FILENAME, "w");if (!file) {perror("Failed to open file for writing");return;}fprintf(file, "%s\n%d\n%f\n", student->name, student->age, student->gpa);fclose(file);
}void readStudentFromFile(Student *student) {FILE *file = fopen(FILENAME, "r");if (!file) {perror("Failed to open file for reading");return;}fscanf(file, "%99s\n%d\n%f\n", student->name, &student->age, &student->gpa);fclose(file);
}int main() {Student s1 = {"Alice", 20, 3.5};saveStudentToFile(&s1);Student s2;readStudentFromFile(&s2);printf("Name: %s\nAge: %d\nGPA: %.2f\n", s2.name, s2.age, s2.gpa);return 0;
}

在上述程序中:

  1. 我们仍然使用了 Student 结构体来保存学生信息。
  2. saveStudentToFile 函数使用 fprintf() 将学生信息格式化为字符串并写入文件。
  3. readStudentFromFile 函数使用 fscanf() 从文件中读取格式化的文本,并填充到提供的 Student 结构体中。
  4. main 函数中,我们的操作与之前的示例相似,但这次我们是读写一个文本文件而不是二进制文件。

程序运行结果如下:

Name: Alice
Age: 20
GPA: 3.50

注意:当处理文本文件时,需要注意文件中的换行符和空格,因为它们可能会影响到 fscanf() 的行为。在实践中,对于真实的应用程序,可能需要使用更健壮的解析方法,例如结合 fgets()sscanf() 来读取和解析文本行。

这篇关于C- fread() fwrite()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/284398

相关文章

fgets()和fread()函数

fgets(): fgets函数用来从文件中读入字符串。fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行

glibc fread函数源码剖析

最近看APUE,看到了fread函数,就把之前想分析的一个函数借这个机会研究一下。 先写个程序,调用一下fread函数。 #include <stdio.h>int main(){char strbuf[12];FILE* fp;fp = fopen("./temp","r");fread(strbuf,sizeof(char),11,fp);return 0;} 好了,还是咱们的

php fwrite()

fwrite() 函数写入文件(可安全用于二进制文件)。 语法 fwrite(file,string,length) 参数 描述 file 必需。规定要写入的打开文件。 string 必需。规定要写入文件的字符串。 length 可选。规定要写入的最大字节数。 说明 fwrite() 把 string 的内容写入文件指针 file 处。 如果指定了 length,当写入了 le

fread/fwrite函数返回值问题

函数原型: #include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); nmemb是需要读取的数据元素个数; size是每个元素字节长;

有关fwrite语句的用法

一:函数名: fwrite   功 能: 写内容到流中   用 法:fwrite(buffer,size,count,fp);   (1)buffer:是一个指针,对fwrite来说,是要输出数据的地址。   (2)size:要写入的字节数;   (3)count:要进行写入size字节的数据项的个数;   (4)fp:目标文件指针。   程序例: #include <stdio.

fseek和fread单独使用线程安全,合在一起需要用线程安全机制

翻译整理自:http://social.msdn.microsoft.com/Forums/vstudio/en-US/ce7799c2-52e0-4b14-b59b-30357ccb3db2/file-seek-then-read-threadsafety?forum=vcgeneral 1、fseek和fread单独使用线程安全 fseek: "This function locks

【c/c++】fprintf和fwrite使用及作用介绍

一、介绍 1、fprintf 原型: int fprintf(FILE *stream, const char *format, ...); 作用: 用于将格式化的数据写入文件。 描述: stream是指向要写入的文件的指针,format是格式化字符串,后面的参数是要写入的数据。fprintf函数可以按照指定的格式将数据写入文件。它支持类似于printf函数的格式化字符串,可以使用占

(C语言)fread与fwrite详解

1. fwrite函数详解 头文件:stdio.h 函数有4个参数,只适用于文件输出流 作用;将从ptr中拿count个大小为size字节的数据以二进制的方式写到文件流中。返回写入成功的数目。 演示 #include <stdio.h>int main(){FILE* pf = fopen("date.txt", "wb");if (pf == NULL){perror("fop

八种顺序读写函数的介绍(fput/getc;fput/gets;fscanf,fprintf;fwrite,fread)

一:读写的含义的解释: 读(读出):即从文件里面读出数据----------->和scanf从键盘里面读出数据类似 写(写入):即把数据写入文件里面----------->和printf把数据写入到屏幕上类似 二:使用读写函数的模型: 1,打开文件  函数功能:用于打开一个文件,并返回一个与该文件关联的FILE指针。 参数解释: filename:这是您想要打开的

fread读取文件读不全的问题解决

问题大概是这样的,用fread读取文件的时候,读取到的长度很小,并没有到预期值。 原因是打开文件的时候用"r"模式,应该成"rb"模式。 代码示例如下 #include <stdio.h>int main(){unsigned char buff[201];int i;FILE *fp;char filename[10];int len;for(i=144;i<146;i++){sp