假设我有一个像这样的文本文件
这是一个包含一些数字的文本文件。
所以我想使用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,我会得到“文件”。开始是14,结束是25。
答案 0 :(得分:2)
您需要大致按以下方式重写代码:
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()
以确保读取正确数量的数据。
答案 1 :(得分:0)
数据结束后的随机字符来自非空终止输入字符串,或不限制输出到读取的数据。 fread()
不会终止'它的内容;如果它确实没用。
你分配的内存太少了。你有:
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);