fgets读取大文件崩溃终止程序
时间: 2023-08-27 17:05:11 浏览: 232
c语言文件读写操作代码
使用 `fgets` 读取大文件时,可能会导致程序崩溃或终止。这是因为 `fgets` 函数在读取文件时将整个文件内容加载到内存中,如果文件过大,就会导致内存不足,从而导致程序崩溃。
为了避免这种情况,可以使用逐行读取文件的方法,即使用 `fread` 函数读取一定大小的字节流,再使用 `strstr` 函数查找换行符 `\n` 的位置,然后将该行内容存储到缓冲区中。这样就可以避免将整个文件内容加载到内存中,从而避免程序崩溃或终止。
以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <file>\n", argv[0]);
exit(EXIT_FAILURE);
}
FILE *fp = fopen(argv[1], "rb");
if (fp == NULL) {
fprintf(stderr, "Failed to open file: %s\n", argv[1]);
exit(EXIT_FAILURE);
}
char buffer[BUFFER_SIZE];
size_t bytes_read = 0;
char *line = NULL;
size_t line_len = 0;
while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, fp)) > 0) {
char *p = buffer;
char *end = buffer + bytes_read;
while ((p = strstr(p, "\n")) != NULL) {
++p;
line_len = p - buffer;
if ((line = realloc(line, line_len)) == NULL) {
fprintf(stderr, "Failed to allocate memory\n");
exit(EXIT_FAILURE);
}
memcpy(line, buffer, line_len - 1);
line[line_len - 1] = '\0';
printf("%s", line);
}
memmove(buffer, p, end - p);
}
free(line);
fclose(fp);
return 0;
}
```
该程序使用了 `fread` 函数读取文件,每次读取 `BUFFER_SIZE` 字节大小的数据,然后使用 `strstr` 函数查找 `\n` 字符的位置,并将该行内容输出。注意,在使用 `realloc` 函数重新分配缓冲区大小时,需要将新的大小设置为 `line_len`,而不是 `line_len + 1`,因为字符串需要一个额外的字节来存储字符串结束符 `\0`。
阅读全文