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

时间:2014-02-09 18:45:12

标签: c file fgets fread

所以我要做的就是打开一个文件并将其读取到每次调用时以256字节长的块结尾。我的困境是使用fgets()fread()来执行此操作。

我最初使用fgets(),因为它返回一个读取的字节字符串,这很好,因为我可以存储该数据并使用它。但是,在我正在阅读的特定文件中,256个字节经常发生超过2行,这是一个问题,因为fgets()在遇到换行符或文件末尾时停止读取。

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

我现在已经搜索并考虑了一段时间的解决方案,但找不到任何适用于我特定场景的内容。我想就如何处理这个问题提供一些指导,你将如何解决这个问题呢?

1 个答案:

答案 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问题。