2017-01-07 2 views
1

Я прочитал тему How to extract data from a file in C, но у меня все еще есть проблемы с извлечением данных из файла на C, потому что у меня есть точный запрос. Вот пример .txt, который мне нужно иметь дело:Извлечение данных из .txt в c

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; х [N], [М] = {{х, х}, {х, х}, {х, х}}; у [Н] = {у, у, у}; 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

Вместо того, чтобы внутренний цикл сделать 'N + 2' итераций, прочитать х годов первым в цикле, а затем прочитать' 'y' и z' более двух' fscanf's. – DyZ

+3

warning: 'else if (j = N)' -> 'else if (j == N)' –

+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); 
} 
+0

Хороший ответ, но вам действительно нужно проверить ВСЕ пользовательский ввод. например 'if (fscanf (f,"% ld% ld ", & M, & N)! = 2) {fprintf (stderr," error: invalid input. \ n "); return 1; } '(вы можете обрабатывать ошибку любым способом). То же самое относится ко всем чтениям. Вы сделали хорошую работу, проверяя, что ваш файл открыт, просто сделайте то же самое для всех пользователей. –

+0

@ Давид К. Рэнкин, хорошее предложение! Я добавляю его в ответ с некоторыми незначительными изменениями. На этот раз ответ выглядит непроницаемым. BTW, маленький мир;) – hmofrad

+0

Твердый ответ. Спасибо! – dowjie

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]); 
} 
+0

Ницца. Не думал об этом. – dowjie

+0

Думаю, вам нужно поменять местами индексы M и N. – hmofrad

Смежные вопросы