c - 如何从文件中保存特定长度的字符串并在 C 中使用它

标签 c file fgets fread

所以我想做的是打开一个文件并读取它,直到每次调用时以 256 字节长的 block 结束。我的困境是使用 fgets()fread() 来做到这一点。

我最初使用的是fgets(),因为它返回读取的字节字符串,这很棒,因为我可以存储该数据并使用它。然而,在我正在读取的特定文件中,256 字节通常出现在超过 2 行中,这是一个问题,因为 fgets() 当遇到换行符或结尾时会停止读取文件的。

然后我想到使用 fread(),但我不知道如何保存我所引用的行,因为 fread() 返回一个 int 指的是成功读取的元素数量(根据其文档)。

我已经搜索并思考了一段时间的解决方案,但找不到任何适合我的特定场景的东西。我想要一些关于如何解决这个问题的指导,如果你处于我的位置,你会如何解决这个问题?

最佳答案

您可以使用 fread() 读取每个 256 字节 block ,并保留一个 lineCount 变量来跟踪到目前为止遇到的新行字符数输入。由于您已经必须处理这些 block ,因此这并不意味着处理过程中会有太多开销。

要读取 256 个字符的 block (我认为您正在做的事情),您只需创建一个可以容纳 256 个字符的缓冲区,换句话说,就是一个大小为 256 的字符数组。

#define BLOCK_SIZE 256
char block[BLOCK_SIZE];

然后,如果您检查 fread() 的文档它显示以下签名:

Following is the declaration for fread() function.

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

Parameters

  • ptr -- This is the pointer to a block of memory with a minimum size of size*nmemb bytes.
  • size -- This is the size in bytes of each element to be read.
  • nmemb -- This is the number of elements, each one with a size of size bytes.
  • stream -- This is the pointer to a FILE object that an input stream.

因此,这意味着它需要一个指向缓冲区的指针,它将在其中写入读取信息、应该读取的每个元素的大小、您希望读取的最大元素数量以及文件指针。在你的情况下,它将是:

int read = fread(block, sizeof(char), BLOCK_SIZE, file);

这会将信息从文件复制到 block 数组,您可以稍后处理并跟踪行。 fread 读取的字符位于 block 数组中,因此最后读取的 block 中的第一个字符将是 block[0],第二个block[1]等等。 read 中的返回值表示当您调用 fread 时,在数组 block 中插入了多少个元素(在您的情况下为字符),该数字将每次调用都等于 BLOCK_SIZE,除非到达文件末尾或出现错误。

我建议你读一些documentation对于完整的示例,请稍微研究一下代码并阅读 C 中的指针,以更好地理解一切的总体工作原理。如果您之后仍有疑问,我们可以从那里获取,或者您可以创建一个新的 SO 问题。

关于c - 如何从文件中保存特定长度的字符串并在 C 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663289/

相关文章:

c - 指针的指针作为函数参数

python - 有效使用python shutil copy2

c - 阅读列表

c - 根据 strlen,在 fgets 调用后写入 char 数组会导致它为空

c - 如何按用户对给定的列和行按列和按行对二维数组进行排序

c - 从 CD-ROM 快速读取数据

java - Java 有什么方法可以获取当前文件名和当前行号?

c - C 中的 Null 终止字符数组以及使用 read 和 fgets 的区别

c - Win32 线程

file - 某些行(虚线)使用 Groovy(Grails) 写入文件失败