【问题标题】:not able to read a file by repetitive use of fgets无法通过重复使用 fgets 来读取文件
【发布时间】:2021-09-26 09:02:29
【问题描述】:

在这段代码中,我试图从文件中读取数据(每行 30 个字符),内容为:

你好世界!学习编码!

123456789123456789123456789123

用来读取这个文件的代码是:

#include<stdio.h>
#include<stddef.h>

int main(void)
{
    FILE *fptr = fopen("n","r");
    char buff[30];
    char *buff_ptr = buff;
    size_t buff_size=30;
    size_t character_count=0;

    buff_ptr = fgets(buff,buff_size,fptr);
    printf("%s\n",buff_ptr);

    fgets(buff,buff_size,fptr);
    printf("%s\n",buff);
    return 0;
}

为什么第二个fgets没有输出?

【问题讨论】:

  • 你的文件真的有空行吗?也许您打印了那个空白行并认为它没有打印任何东西? fgets返回又是什么?它可能会失败,然后会返回 NULL,这是您始终需要检查的内容(以及检查 fopen 是否也不会失败)。
  • @Someprogrammerdude fgets 正在返回指向正在保存内容的缓冲区的指针,并且正在读取的文本文件中没有空行。
  • 30 在这段代码中不是一个快乐的幻数,你至少需要 32 才能读取一行。一个额外的行尾,一个额外的零终止符。
  • @user3121023 所以如果另一个fgets 被添加到代码中,那么文件的下一行将被读取?还有,为什么使用getline时不会出现这个问题?
  • 知道,您可以读取整个文件,一次读取 29 个字节。这没什么错,您只是更频繁地调用fgets(),导致效率略有下降。教训:不要吝啬缓冲区大小1024 是一个不错的 1K 缓冲区,2048 是一个 2K 缓冲区。

标签: c newline c-strings fgets


【解决方案1】:

你需要在读取数据的地方放大字符数组。

fgets 的第一次调用正好读取 29 个字符(为终止零字符 '\0' 保留一个字符),这些字符出现在文件的第一条记录中,位于换行符 '\n' 之前。第二次调用读取这个换行符。

来自 C 标准(7.21.7.2 fgets 函数)

2 fgets 函数读取的次数最多小于 1 从流指向的流中由 n 指定的字符 into s 指向的数组。 a 后不读取其他字符 换行符(保留)或在文件结尾之后。 null 在读入最后一个字符后立即写入字符 数组。

声明数组例如like

char buff[100];

并致电fgets 喜欢

fgets( buff, sizeof( buff ), fptr );

这是一个演示程序,它显示具有 30 个元素的数组不足以读取整个第一条记录。即第一条记录包含30多个字符。

#include <stdio.h>
#include <string.h>

int main(void) 
{
    const char record[] = "hello world! Learning to code!\n";
    
    printf( "strlen( record ) = %zu\n", strlen( record ) );
    
    return 0;
}

程序输出是

strlen( record ) = 31

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多