所以我要做的就是打开一个文件并将其读取到每次调用时以256字节长的块结尾。我的困境是使用fgets()
或fread()
来执行此操作。
我最初使用fgets()
,因为它返回一个读取的字节字符串,这很好,因为我可以存储该数据并使用它。但是,在我正在阅读的特定文件中,256个字节经常发生超过2行,这是一个问题,因为fgets()
在遇到换行符或文件末尾时停止读取。
然后我考虑使用fread()
,但我不知道如何保存我用它引用的行,因为fread()
返回一个int,指的是成功读取的元素数(根据其文件)。
我现在已经搜索并考虑了一段时间的解决方案,但找不到任何适用于我特定场景的内容。我想就如何处理这个问题提供一些指导,你将如何解决这个问题呢?
答案 0 :(得分:0)
您可以使用fread()
读取每个256字节的块并保留lineCount
变量,以跟踪您在输入中到目前为止遇到的新行字符的数量。由于您必须处理块,因此这并不意味着处理过多的开销。
要读取256个字符的块,这是我认为你正在做的,你只需要创建一个可以容纳256个字符的字符缓冲区,换句话说就是一个256字节的字符数组。
#define BLOCK_SIZE 256
char block[BLOCK_SIZE];
然后,如果您查看fread()
的文档,则会显示以下签名:
以下是fread()函数的声明。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
ptr
- 这是指向内存块的指针,其最小大小为* nmemb字节。size
- 这是要读取的每个元素的大小(以字节为单位)。nmemb
- 这是元素的数量,每个元素的大小都是字节大小。stream
- 这是指向输入流的FILE对象的指针。
所以这意味着它需要一个指向缓冲区的指针,它将写入读取信息,它应该读取的每个元素的大小,您希望它读取的元素的最大数量以及文件指针。在你的情况下,它将是:
int read = fread(block, sizeof(char), BLOCK_SIZE, file);
这会将信息从文件复制到块数组,您可以在以后处理并跟踪这些行。 fread
读取的字符位于block
数组中,因此最后一个读取块中的第一个字符为block[0]
,第二个block[1]
依此类推。 read
中返回的值表示当您致电block
时,数组fread
中插入了多少元素(在您的案例中为字符),此数字将等于BLOCK_SIZE
每次通话,除非您到达文件末尾或出现错误。
我建议您阅读一些documentation以获取完整示例,稍微阅读代码并对C中的指针进行一些阅读,以便更好地理解一切如何工作。如果您在此之后仍有疑问,我们可以从那里接受,或者您可以创建一个新的SO问题。