2014-06-23 19 views
1

我正在从一个文件中读取文件,其中有数千个以纯文本形式写入的浮点数,以换行符分隔。漂浮物本身被空白分开,偶尔也会有一个分号(分隔每组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大。

+3

您是否尝试过'fscanf'? –

+0

我不会说谎,C++解析比C更容易。但是fscanf对于浮动很有效。 –

+1

@larsmans - ...我很密集。我一直使用'scanf()',但是。今天有一个Duh Moment。谢谢! –

回答

1

它最终可能在读一浮的中间...

那不是为fgets一个问题,如果一个浮子板缺,fseek的开始这种浮动的,并从那里继续阅读,例如:

/*数据*/

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 
+0

为什么还要花所有额外的工作?你的double-while-loop可以替换为'while(fscanf(“%lf”,&d)== 1){printf(“%f \ n”,d); }'。 –

+0

在这种情况下是这样,但一般情况下'fscanf''必须避免(磁盘访问是昂贵的) –

+1

我最终使用'fscanf',每次调用查询9个浮点数,因为浮点数保证可以被9整除。但对于其他情况,我认为这是一个非常有效的解决方案。 –

相关问题