c - 每行从文本文件中打印 x 个字节,直到 EOF

标签 c file-io fread

所以我有一个被读取的文件。用户可以指定一次打印多少字节。
目前我有:

while(fread(buffer, bytes, 1, txtFile) != '\0')
    printf("%s\n", buffer);

但是,如果它首先到达 EOF,它会截断最后一行。例如,如果 bytes = 12 ,则打印:

How the migh
ty have fall

...但我希望它打印出来:

How the migh
ty have fall
en!

相反。执行此操作的正确方法是什么?

最佳答案

fread 函数返回从文件中读取的 数。这个电话:

fread(buffer, bytes, 1, txtFile)

表示尝试读取大小为 bytes 的项目。如果成功则结果为 1,如果失败则结果为 0。您编写 != '\0' 的事实表明您可能误解了返回值。它似乎适用于较早的行,因为 0 == '\0',但它是一种误导性的写法 0

由于文件中只剩下 4 字节,它无法读取大小为 12 字节的项目,因此您的循环退出。

另一个主要问题是您调用 printf("%s" 但是您没有提供字符串作为参数。string 和数组之间存在差异char。字符串以空终止符结尾,这就是 printf 函数知道何时停止打印的方式。

如果改为读取大小为 1 的项目,则可以解决这两个问题,例如:

for (size_t n_read; (n_read = fread(buffer, 1, bytes, txtFile)) > 0; )
{
    buffer[n_read] = '\0';
    puts(buffer);
}

注意。确保分配的 buffer 中至少有 bytes + 1 字节。

关于c - 每行从文本文件中打印 x 个字节,直到 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697546/

相关文章:

c# - 读取另一个进程使用的文件

c++ - C 函数可以运行,C++ 版本不行

c - 从文件中读取 2 个字节并转换为 int 会给出错误的输出

C:从二进制文件中读取的 unsigned short 与原始模式不匹配后存储到缓冲区中

我可以检查宏的值吗?

c - 获取用户输入并将其分割成一个结构,以便传回给 execvp

php - fatal error : Call to a member function prepare() on a non-object

C 不从文件加载信息(fread、fwrite)

c# - Microsoft .net,值得吗?

c - Getopt- 为参数传递字符串参数