所以我想做的是打开一个文件并读取它,直到每次调用时以 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/