fread与fgets
时间: 2023-08-11 21:35:42 浏览: 106
`fread()`和`fgets()`都是C语言标准库中用于读取文件内容的函数,但它们有一些不同之处。
`fread()`函数的原型为:
```c
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
```
该函数从指定的`stream`中读取数据,每次读取`size`字节,最多读取`count`次,将读取到的数据存储到`ptr`指向的内存中。函数返回实际读取到的元素个数(即`count`和实际读取次数中的较小值),如果返回值为0,则表示已经读取到文件末尾或发生了错误。
与之相对,`fgets()`函数的原型为:
```c
char *fgets(char *str, int n, FILE *stream);
```
该函数从指定的`stream`中读取一行数据,最多读取`n-1`个字符,将读取到的数据存储到`str`指向的内存中,并在结尾处添加一个空字符`\0`。函数返回指向`str`的指针,如果返回值为`NULL`,则表示已经读取到文件末尾或发生了错误。
因为`fread()`函数是按照字节读取数据的,所以它在读取二进制文件时比较常用。而`fgets()`函数则常用于读取文本文件中的一行数据。如果读取二进制文件时使用`fgets()`函数,可能会出现读取到换行符`\n`时停止读取的情况,导致读取的数据不完整。
总的来说,`fread()`函数适用于读取二进制文件,而`fgets()`函数适用于读取文本文件。
相关问题
fread与fgets的区别
fread和fgets是C语言中处理文件读取的两个函数,它们有一些区别:
1. fread函数:
- fread函数是二进制模式下读取文件的函数,可以一次读取指定字节数的数据。
- 它的函数原型为:`size_t fread(void *ptr, size_t size, size_t count, FILE *stream)`。
- 第一个参数ptr是用于存储读取数据的缓冲区的指针。
- 第二个参数size是每个数据项的大小(以字节为单位)。
- 第三个参数count是要读取的数据项的数量。
- 第四个参数stream是要读取的文件指针。
- fread函数返回成功读取的数据项数目。
- 适合读取二进制文件或者已知格式的结构化数据。
2. fgets函数:
- fgets函数是文本模式下逐行读取文件的函数。
- 它的函数原型为:`char *fgets(char *str, int n, FILE *stream)`。
- 第一个参数str是用于存储读取行的字符数组(字符串)的指针。
- 第二个参数n是要读取的最大字符数(包括终止符'\0')。
- 第三个参数stream是要读取的文件指针。
- fgets函数返回成功读取到的字符串指针,如果到达文件末尾或出错,则返回NULL。
- 适合逐行读取文本文件,例如读取配置文件、日志文件等。
总结来说,fread函数适合读取二进制文件或者已知格式的结构化数据,而fgets函数适合逐行读取文本文件。
fread , fgets
### 文件读取函数 `fread` 和 `fgets` 的区别
#### 1. 功能差异
`fread` 是用于从流中读取指定数量的数据项到内存缓冲区中的函数。该函数适用于二进制数据以及文本数据的读取,具有较高的灵活性。
```c
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
```
相比之下,`fgets` 主要用于从流中读取字符串直到遇到换行符或达到最大长度限制。此函数专为处理文本设计,在读入字符数组时会自动加入终止符 `\0`[^2]。
```c
char *fgets(char *str, int n, FILE *stream);
```
#### 2. 参数说明
对于 `fread` 而言:
- `ptr`: 存储读取数据的目标地址。
- `size`: 单个数据项大小(字节数)。
- `nmemb`: 数据项数目。
- `stream`: 输入流指针。
而对于 `fgets` 来说,则有如下参数定义:
- `str`: 字符串存储位置。
- `n`: 最大可读取字符数(含结束符`\0`)。
- `stream`: 输入流指针。
#### 3. 返回值解释
当成功执行时,`fread` 将返回实际读取的数据项总数;如果未到达文件结尾而提前停止,则表示发生了错误或遇到了文件末尾。另一方面,`fgets` 成功则返回指向所读取字符串的第一个字符的指针;若已到达文件末端或发生其他异常情况,则返回 NULL 值。
#### 使用实例展示
以下是两个不同场景下的代码片段来对比这两种方法的应用方式。
##### 示例一:利用 `fread` 进行批量读取
假设有一个名为 "data.bin" 的二进制文件,其中保存了一组整型数值。可以采用下面的方式将其加载至程序内部变量 array 中。
```c
#include <stdio.h>
int main() {
FILE* fp;
int i, num_items = 5;
int array[num_items];
// 打开并检查文件是否存在
if ((fp = fopen("data.bin", "rb")) == NULL){
printf("无法打开文件\n");
return -1;
}
// 使用 fread 函数一次性读取多个整数
fread(array, sizeof(int), num_items, fp);
fclose(fp);
for (i=0;i<num_items;i++)
printf("%d ",array[i]);
return 0;
}
```
##### 示例二:通过 `fgets` 获取单行输入
这里给出一段简单的命令行交互逻辑,提示用户输入个人信息,并将结果存放在 buffer 变量里供后续处理。
```c
#include <stdio.h>
#define BUFFER_SIZE 100
int main(){
char name[BUFFER_SIZE];
printf("请输入您的姓名:");
fgets(name,BUFFER_SIZE,stdin);
/* 移除可能存在的多余回车 */
name[strcspn(name,"\n")]='\0';
printf("您好,%s!\n",name);
return 0;
}
```
阅读全文
相关推荐










