我正在读取一个文件,其中有几千个用纯文本写的浮点数,用换行符分隔的部分。浮标本身由空格分隔,偶尔用分号(将每组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大。
答案 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