如何从文件中保存特定长度的字符串并在C中使用它
所以我要做的是打开一个文件并读取它,直到每次调用它时都以256字节长的块结束。我的困境是使用如何从文件中保存特定长度的字符串并在C中使用它,c,file,fgets,fread,C,File,Fgets,Fread,所以我要做的是打开一个文件并读取它,直到每次调用它时都以256字节长的块结束。我的困境是使用fgets()或fread()来实现 我最初使用的是fgets(),因为它返回读取的字节字符串,这很好,因为我可以存储数据并使用它。但是,在我正在读取的特定文件中,256字节经常出现在超过2行的地方,这是一个问题,因为fgets()在遇到换行符或文件结尾时停止读取 然后我考虑使用fread(),但我不知道如何保存我引用的行,因为fread()返回一个int,表示成功读取的元素数(根据其文档) 我已经搜索并
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)
参数
——这是指向最小大小为size*nmemb字节的内存块的指针ptr
——这是要读取的每个元素的大小(以字节为单位)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
),我认为内存根本没有将内容存储到指针的地址。谢谢你澄清:)