如何在没有换行符的情况下缓冲从大文件读取的数据

时间:2014-06-23 20:08:45

标签: c buffer stdio

我正在读取一个文件,其中有几千个用纯文本写的浮点数,用换行符分隔的部分。浮标本身由空格分隔,偶尔用分号(将每组3个分开)。换行符直到最后才出现,后来是一个未知(但可能是数万)的字符。

我使用的语言是C

3Dmodel.txt
-----

Obj1 Vertice count=5842;
{
0.499507 -0.003674 0.699311; 0.454010 -0.075165 ... -0.022236 \n (newline)
}

我的问题是,从文件中提取字符串到内存的最佳方法是什么?

我似乎无法使用fgets(),因为换行到目前为止,并且因为它可能会在浮动的中间读取结果,使其不完整。将整个文件读入内存似乎是不必要的昂贵,但如果它是唯一的方法则不会很糟糕,因为每个文件只有2MB到10MB大。

1 个答案:

答案 0 :(得分:1)

  

它可能会在浮动中间读完......

fgets不是问题,如果浮动被切割,fseek到这样的浮动的开头并继续从那里读取,例如:

/ * data * /

1.23 2.12 3.24 98.88 78.243 3.34 3.4 23.5 54.5
7.8 9.0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char s[16], *p, *q;
    double d;
    FILE *f;

    f = fopen("data", "r");
    if (f == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    while ((p = fgets(s, sizeof s, f)) != NULL) {
        while (1) {
            d = strtod(p, &q);
            if (p == q) break;
            if (*q == '\0') {
                /* cutted, must adjust */
                printf("Cutted at <%s>, adjusting ...\n", p);
                fseek(f, -strlen(p), SEEK_CUR);
                break;
            }
            printf("%f\n", d);
            p = q;
        }
    }
    fclose(f);
    return 0;
}

输出:

1.230000
2.120000
3.240000
98.880000
78.243000
Cutted at < 3.>, adjusting ...
3.340000
3.400000
23.500000
54.500000
7.800000
9.000000