[英]problem reading a file in c
这个 function 应该得到一个向量文件。 第一行包含维度。 所有其他行都采用“P:3,5,2”的形式。 字母是 P 或 N,数字是坐标。 此 function 每次调用时都会读取一行,并将 P/N 字符和坐标保存到双精度数组中。
void readSamplesFile(FILE *sample_p, double result[])
{
if (dimension == 0)
{
fscanf(sample_p,"%lf",&dimension);
}
printf("dimentions: %lf\n",dimension);
printf("LINE \n");
int index;
for (index = 0; index<dimension; index++)
{
printf("%d",index);
fscanf(sample_p,"%lf%*[:,]",&result[index]);
printf("%lf",result[index]);
}
}
当我运行它时,我得到一个无限循环。 尺寸被正确读取,但它打印
LINE
00.00000010.000000dimentions: 2.000000
不休。 任何想法为什么? 希望我很清楚
编辑:我添加了调用 function:
void fillArray(FILE *sample_p,FILE *separators_p){
double coordinates[MAX_DIMENSION];
while (!feof(sample_p)){
readSamplesFile(sample_p,coordinates);
}
}
ps fscanf 设置为读取:并且,但忽略它们。
'P' 和 'N' 都不是有效的双精度数,它们也不是 ':' 或 ',',因此fscanf()
失败。 您应该始终检查fscanf()
的返回值。
我们还可以讨论使用fgets()
读取一行并使用sscanf()
解析它是否会更好。 这样做可以避免一些问题; 这是我自动编码的方式。
此代码似乎适用于输入文件:
3
P:3,5,2
N:21.12,2.345e6,1.9132e-34
产生 output:
dimension: 3.000000
LINE: P:3,5,2
P:offset=2:0=3(2):1=5(4):2=2(6):
LINE: N:21.12,2.345e6,1.9132e-34
N:offset=2:0=21.12(2):1=2.345e+06(8):2=1.9132e-34(16):
我仍然不热衷于(误)使用浮点dimension
,但它有效。
#include <stdio.h>
enum { MAX_DIMENSION = 6 };
enum { MAX_BUFFSIZE = 4096 };
static double dimension = 0.0;
static int get_dimension(FILE *fin)
{
char buffer[MAX_BUFFSIZE];
if (fgets(buffer, sizeof(buffer), fin) == 0)
return -1;
if (sscanf(buffer, "%lf", &dimension) != 1)
return -1;
printf("dimension: %lf\n", dimension);
return 0;
}
static int readSamplesFile(FILE *sample_p, double result[])
{
char buffer[MAX_BUFFSIZE];
if (fgets(buffer, sizeof(buffer), sample_p) == 0)
return -1;
printf("LINE: %s", buffer);
char c;
int offset;
if (sscanf(buffer, " %c:%n", &c, &offset) != 1)
return -1;
printf("%c:", c);
printf("offset=%d:", offset);
for (int index = 0; index < dimension; index++)
{
int newoff;
if (sscanf(&buffer[offset], "%lf%*[:,]%n", &result[index], &newoff) < 1)
return -1;
printf("%d=%g(%d):", index, result[index], offset);
offset += newoff;
}
putchar('\n');
return 0;
}
static void fillArray(FILE *sample_p)
{
double coordinates[MAX_DIMENSION];
while (readSamplesFile(sample_p, coordinates) == 0)
;
}
int main(void)
{
if (get_dimension(stdin) == 0)
fillArray(stdin);
return 0;
}
请注意,所写的fillArray()
function 不会对数据行做任何事情。 没有检查指定的尺寸是否为正且不大于MAX_DIMENSION
(这将 go in get_dimension()
)。 将get_dimension()
分成单独的 function 比将其隐藏在readSampleFile()
中感觉更干净。 有一种说法是readSampleFile()
应该重命名为readSampleLine()
因为它一次只处理一行,而不是一次处理整个文件。
%n
格式说明符的使用有点棘手,但代码需要知道在下一个周期从哪里恢复读取缓冲区。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.