从c中的.txt中提取数据

时间:2017-01-07 01:21:22

标签: c algorithm

我已经阅读了主题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]);

2 个答案:

答案 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);
}