假设我有一个像这样的文本文件
这是一个包含一些数字的文本文件 .
所以我想用fseek和fread来阅读文本文件的某些部分 . 例如,从位置0到13,我将得到“这是一个文本” . 然后从第14位到第24位,我将得到“文件”,然后从位置25到文件末尾,我将得到“包含一些数字” .
我试过使用fseek和fread,但我还有一些额外的奇怪字符,比如“这是一个文本?”
我尝试使用fseek和fread:
src = fopen(textfile, "r");
int chunksize = data[i].end - data[i].start;
char *buffer = malloc(sizeof(chunksize));
seek(src, data[i].start, SEEK_SET);
fread(buffer, 1, chunksize, src);
fseek(src, 0, SEEK_SET); // seek back to beginning of file
其中 data[i].start
是读取到零件的起始位置, data[i].end
是要停止的最终位置 . 例如,从14到24,我会得到" file which" . 开始是14,结束是25 .
2 回答
您需要大致如下重写代码:
所以,我们有以下内容,一个包含从文件中读取的内容的缓冲区 . 我们在阅读内容后有一个字符串终结符(可能比您要求的要少) . 如果您现在发出:
您将获得从文件中读取的内容 .
PS:最好检查
fopen()
的返回,以确保文件正确打开,并从malloc()
返回以确保内存已成功分配,并从fread()
返回以确保正确的数据量是读 .数据结束后的随机字符来自非空终止输入字符串,或不限制输出到读取的数据 .
fread()
不是'null terminate'它读的是什么;如果它这样做就没用了 .你分配的内存太少了 . 你有:
你需要:
或者您可以分配一个额外的字节并在其中存储空字节
'\0'
. 如果您需要将其传递给需要字符串的代码,则更好:你应该检查大多数函数的错误返回;具体来说,你应该注意
malloc()
,fopen()
和fread()
. 您还需要使用fseek()
,而不是seek()
.您可以使用:
要么: