[英]Unable to read the entire file correctly using fseek() and fread()
[英]read a specific number of characters in the text file using fread and fseek
假设我有一个这样的文本文件
这是一个包含一些数字的文本文件。
因此,我想使用fseek和fread来读取文本文件的某些部分。 例如,从位置0到13,我将得到“这是一个文本”。 然后从位置14到24,我将得到“ file which”,然后从位置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。
您大约需要重写代码,如下所示:
src = fopen(textfile, "r");
int chunksize = ...
char *buffer = malloc(chunksize + 1);
fseek(src, data[i].start, src);
int len = fread(buffer, 1, chunksize, src);
*(buffer+len) = '\0';
因此,我们有了以下缓冲区,其中包含从文件读取的内容。 在读取的内容后面有一个字符串终止符(可能比您要求的要少)。 如果您现在发出:
print("%s\n", buffer)
您将获得从文件中读取的内容。
PS:这是检查从返回的是一个好主意fopen()
以确保文件正确打开,并从返回malloc()
以确保成功地分配内存,并从返回fread()
以确保读取了正确数量的数据。
数据结尾之后的随机字符是由于输入字符串不为空而终止,或者不是将输出限制为读取的数据。 fread()
不会“ null终止”它读取的内容; 如果这样做的话,那将毫无用处。
您分配的内存太少。 你有:
char *buffer = malloc(sizeof(chunksize));
你需要:
char *buffer = malloc(chunksize);
或者,您可以分配一个额外的字节并在其中存储一个空字节'\\0'
。 如果您需要将其传递给需要字符串的代码,则更好:
char *buffer = malloc(chunksize + 1);
您应该检查大多数函数的错误返回。 具体来说,您应该注意malloc()
, fopen()
和fread()
。 您还需要使用fseek()
,而不是seek()
。
您可以使用:
src = fopen(textfile, "r");
if (src == 0)
err_exit("Failed to open %s for reading\n", textfile);
int chunksize = data[i].end - data[i].start;
char *buffer = malloc(chunksize + 1);
if (buffer == 0)
err_exit("Failed to allocate %d bytes memory\n", chunksize);
fseek(src, data[i].start, SEEK_SET);
size_t nbytes = fread(buffer, 1, chunksize, src);
fseek(src, 0, SEEK_SET);
buffer[nbytes] = '\0';
if (nbytes != 0)
printf("Read: <<%.*s>>\n", (int)nbytes, buffer);
要么:
prinf("Read: <<%s>>\n", buffer);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.