使用fread和fseek读取文本文件中的特定数量的字符

时间:2014-10-11 20:02:19

标签: c

假设我有一个像这样的文本文件

  

这是一个包含一些数字的文本文件。

所以我想使用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。

2 个答案:

答案 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);