我要求通过c程序逐行读取文件。
我知道我可以通过使用FILE指针并使用fgets
(如果使用固定长度字符串)或fgetc
(如果按字符逐个字符)来直接执行此操作。这里要注意的唯一一点是文件中一行的长度可以不同。所以,如果我正在使用
char *fgets(char *__restrict s, int n, FILE *__restrict stream);
我不知道“int n”的值,因为它可能会因文件中的行而异。
我搜索了这个查询的答案,但我知道了getline
函数的用法,这是c ++函数。对我来说,唯一的方法是阅读每个字符,直到遇到'\ n'并将其复制到字符串中。
有没有其他方法可以直接在c程序中执行此操作?
答案 0 :(得分:0)
选中此项 - > explanation(可能重复的问题)
记录getline
函数 - > here
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
FILE *fp;
char *line = NULL;
size_t len = 0;
ssize_t myread;
fp = fopen("/etc/motd", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((myread = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu :\n", myread);
printf("%s", line);
}
free(line);
exit(EXIT_SUCCESS);
}
答案 1 :(得分:0)
我不知道&#34; int n&#34;的价值。这里因为文件中的行与行不同。
以上和其他讨论意味着OP需要将缓冲区自动调整为行长度的代码。如果您愿意接受最大长度,fgets()
可以完成工作。读取该行,然后复制到正确大小的缓冲区。
#define BUF_SIZE 1000
char buf[BUF_SIZE];
while (fgets(buf, sizeof buf, stream)) {
// Add long line detection here if desired
char *s = strdup(buf);
foo(s);
}
如果代码不想强加任何最大长度IMO,那就是弱设计。当然行可以很长,上面的BUF_SIZE
应该是非常慷慨的值,但是允许代码处理任何长度的行是为了控制对外部力量的程序是文件或用户输入。这是黑客利用的基础。给定的应用程序应该具有可接受的行长度的自由上限。 fgets()
提供了 - 虽然它确实有其他弱点。常见的* nix getline()
允许外部力量导致程序在一次调用中消耗最多SIZE_MAX
个字节 - 而不是防御性代码。