我已经阅读了主题How to extract data from a file in C,但是我仍然遇到从C中的文件中提取数据的问题,因为我有一个精确的请求。这是我必须处理的.txt的一个例子:
2
3
x x y z
x x y z
x x y z
4 5
两个第一个整数很重要。由于我们首先按此顺序有2(= M)和3(= N),这意味着这些数字后面的正方形的格式为Nx(M + 2),即N行数和M + 2列数和最后一行将有M个数字。
我假设x,y和z是双精度数,以突出我想要提取的内容。
我的目标是获取将生成的代码: M = 2; N = 3; X [N] [M] = {{X,X},{X,X},{X,X}}; Y [N] = {Y,Y,Y}; Z [N] = {Z,Z,Z}; t [M] = {4,5}; 对于文件中的任何输入。
这是我尝试的但它不起作用,因为我想我真的不知道如何管理我们读取文件的位置:
long i,j,M,N;
FILE *f;
f=fopen("file.txt","r");
fscanf(f,"%ld %ld",&M,&N);
double x[M][N],y[N],z[N],t[M];
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
fscanf(f,"%g",&x[i][j]);
fscanf(f,"%g",&y[i]);
fscanf(f,"%g",&z[i]);
}
for(j=0;j<M;j++)
fscanf(f,"%g",&t[j]);
答案 0 :(得分:1)
通过分离常规读数和不规则读数来简化循环结构:
for(i=0;i<M;i++) {
for(j=0;j<N;j++)
fscanf(f,"%ld",&x[i][j]);
fscanf(f,"%ld",&y[i]);
fscanf(f,"%ld",&z[i]);
}
答案 1 :(得分:1)
以下是您的问题的完整答案,以及一些可以提高程序稳定性的保守更改。我使用的扫描代码是%lg
,它与double
数据类型兼容。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *f;
f = fopen("file.txt","r");
if(!f)
{
perror("file open failed");
exit(1);
}
long int i, j, M, N;
if(fscanf(f,"%ld %ld",&M,&N) != 2) {perror("error: invalid input."); exit(1);}
double x[M][N], y[N], z[N], t[M];
for(i = 0; i < N; i++)
{
for(j = 0; j < M; j++)
{
if(fscanf(f,"%lg",&x[i][j]) != 1) {perror("error: invalid input."); exit(1);}
}
if(fscanf(f,"%lg",&y[i]) != 1) {perror("error: invalid input."); exit(1);}
if(fscanf(f,"%lg",&z[i]) != 1) {perror("error: invalid input."); exit(1);}
}
for(i = 0; i < M; i++)
{
if(fscanf(f,"%lg",&t[i]) != 1){perror("error: invalid input."); exit(1);}
}
if(fclose(f))
{
perror ("file close failed");
exit(1);
}
return(0);
}