首页 文章

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

提问于
浏览
0

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

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

所以我想用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 回答

  • 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() 返回以确保正确的数据量是读 .

  • 0

    数据结束后的随机字符来自非空终止输入字符串,或不限制输出到读取的数据 . fread() 不是'null terminate'它读的是什么;如果它这样做就没用了 .

    你分配的内存太少了 . 你有:

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

相关问题