gpt4 book ai didi

c - 我如何从c文件中读取一行?

转载 作者:太空宇宙 更新时间:2023-11-04 00:01:57 25 4
gpt4 key购买 nike

我需要通过 C 程序逐行读取文件。我知道我可以通过使用 FILE 指针并使用 fgets(如果按固定长度字符串)或 fgetc(如果按字符逐个字符)来非常直接地完成它。这里唯一需要注意的一点是文件中一行的长度可以不同。所以,如果我使用

char *fgets(char *__restrict s, int n, FILE *__restrict stream); 

我不知道这里“int n”的值,因为它在文件中的每一行都不同。

我搜索了这个查询的答案,但我知道了 getline 函数的用法,它是 c++ 函数。对我来说,唯一的方法是读取每个字符,直到遇到 '\n' 并将其复制到字符串中。

有没有其他方法可以直接在 C 程序中执行此操作?

最佳答案

I do not know the value of "int n" here since it can vary from line to line in the file.

上述和其他讨论暗示 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 字节 - 而不是防御性代码。

关于c - 我如何从c文件中读取一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39765447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com