繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM