【问题标题】:how to download an unrestricted line from a file using the fread function?如何使用 fread 函数从文件中下载不受限制的行?
【发布时间】:2020-09-03 11:12:23
【问题描述】:

我有一个问题,如何在不指定该行大小的情况下从文件中下载一行文本?我不想使用 fgets,因为您必须提前将 fgets 提供给角色。我可以加载整个文件,但不能加载一行。

FILE *f
 long lSize;
 char *buffer;
 size_t result;

f = fopen("file.txt", "r");

 fseek(f, 0, SEEK_END);
 lSize = ftell(f);
 rewind (f);

 buffer = (char*)malloc(sizeof(char)*lSize);

 result = fread(buffer,1,lSize, f);

fclose(f);
free(buffer);

【问题讨论】:

  • 谢谢。我会尝试实现它。 :)
  • 按照 user3121023 的建议去做。现在你有线了。如果您只想要 that 行,则可以使用以下命令将缓冲区修剪为确切大小:buffer = realloc(buffer,strlen(buffer) + 1); 请注意:sizeof(char)always 1(根据定义) ,而不管给定架构上char 的实际位大小如何,因此您可以[并且应该] 只是这样做:buffer = malloc(lSize); 大多数拱门有 8 位字节,但是,例如,某些 TI DSP芯片,最小可寻址单元为16位。所以,char 占用 16 位,但 sizeof(char) 仍然 1 在那里。

标签: c fread ansi line-by-line gcc-pedantic


【解决方案1】:
  1. 使用 malloc() 为您的文本行设置一个初始缓冲区。比如说,16 个字符。

  2. 遍历文件并使用 fgetc() 一次检索一个字符。将其存储到缓冲区中的适当位置。如果是换行符,则在缓冲区中放入一个 NUL 字符并退出循环。

  3. 当缓冲区快满时,realloc() 并将其扩展为 16 个更多字符。如果重新分配成功,请转到步骤 2。

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2014-03-14
    • 2012-02-29
    • 1970-01-01
    • 2020-10-19
    • 2019-11-07
    相关资源
    最近更新 更多