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

如何从文件中保存特定长度的字符串并在C中使用它,c,file,fgets,fread,C,File,Fgets,Fread,所以我要做的是打开一个文件并读取它,直到每次调用它时都以256字节长的块结束。我的困境是使用fgets()或fread()来实现 我最初使用的是fgets(),因为它返回读取的字节字符串,这很好,因为我可以存储数据并使用它。但是,在我正在读取的特定文件中,256字节经常出现在超过2行的地方,这是一个问题,因为fgets()在遇到换行符或文件结尾时停止读取 然后我考虑使用fread(),但我不知道如何保存我引用的行,因为fread()返回一个int,表示成功读取的元素数(根据其文档) 我已经搜索并

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

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

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

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

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

要读取256个字符的块(我认为您正在执行的操作),您只需要创建一个字符缓冲区来容纳256个字符,换句话说,一个大小为256的字符数组

#define BLOCK_SIZE 256
char block[BLOCK_SIZE];
然后,如果您检查文档,它会显示以下签名:

下面是fread()函数的声明

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

  • ptr
    ——这是指向最小大小为size*nmemb字节的内存块的指针
  • size
    ——这是要读取的每个元素的大小(以字节为单位)
  • nmemb
    ——这是元素的数量,每个元素的大小为字节
  • stream
    ——这是指向输入流中包含的文件对象的指针
这意味着它需要一个指向缓冲区的指针,它将在缓冲区中写入读取信息,它应该读取的每个元素的大小,您希望它读取的元素的最大数量,以及文件指针。在您的情况下,它将是:

int read = fread(block, sizeof(char), BLOCK_SIZE, file);
这将把文件中的信息复制到块数组中,您可以在以后处理并跟踪线。
fread
读取的字符位于
数组中,因此最后读取的块中的第一个字符将是
块[0]
,第二个
块[1]
,依此类推。
read
中的返回值表示在调用
fread
时,数组
block
中插入了多少个元素(在您的情况下是char),该数字将等于每次调用的
block\u SIZE
,除非到达文件末尾或出现错误


我建议您阅读一些完整的示例,玩一点代码,阅读一些C语言中的指针,以便更好地理解一般情况下的工作原理。如果在此之后您还有问题,我们可以从那里开始,或者您可以创建一个新的SO问题。

据我所知,您有两个要求:读取256字节的块,并跟踪开始读取当前块的行数。这是对的吗?事实上是的,你是对的。我还希望存储引用256字节块的字符串,并在将下一个256字节块存储到变量之前对其执行计算读取每个256字节块,并保留一个
lineCount
变量,以跟踪到目前为止在输入中遇到的新行字符数。因为你已经要处理这些块了,这并不意味着在处理过程中会有太多的开销。嘿,这是个好主意!只是我不知道如何以可变顺序存储256字节的块来处理它们,如果
fread()
返回一个int而不是字符串,我明白你的意思,这很有意义。如果
read
变量是
int
而不是字符串,那么如何从
read
变量访问
fread()
的写入字符串信息,我只是有点困惑?例如,如果我想打印写入的块,我将如何使用
read
?我可以做
printf(“%s”,read)吗
?@Karysto:您的困惑似乎源于您需要使用read()的返回值。将指向缓冲区的指针作为参数传递给read(),函数将填充指定指针的缓冲区。然后处理缓冲区,而不是返回的字符数。@MrWonderful@juan.facorro你们都很棒!我还没有试过,但现在完全有道理了。我肯定是一心想用
fread()的返回值来处理它。这是否意味着每次读取一个新块时都会给缓冲区分配一个新值?@juan.facorro我肯定与
fread()
的文档混淆了,我认为第一个参数是指向每次调用所需内存字节的指针(或多或少类似于
malloc
),我认为内存根本没有将内容存储到指针的地址。谢谢你澄清:)