2016-10-13 3 views
0

У меня есть текстовый файл (H.txt), который выглядит примерно так:Как я прочитал двоичные данные из текстового файла и сохранить его в 2D массив в C

1 0 1 1 0 1 
0 0 1 1 0 0 
0 0 0 1 0 0 
1 1 1 0 0 0 

мне нужно прочитать текстовый файл в 2D-массив с именем H. Размер текстового файла может изменяться по длине и ширине (т. е. может быть больше строк и больше столбцов двоичных данных, чем приведенный выше пример).

Вот что я до сих пор:

#import <stdio.h> 

int main() 
{ 

    int m = 4; 
    int n = 6; 
    int H[m][n]; 

    FILE *ptr_file; 
    char buf[1000]; 

    ptr_file = fopen("H.txt", "r"); 
    if (!ptr_file) 
     return 1; 

    fscanf(ptr_file,"%d",H); 

    fclose(ptr_file); 
    return 0; 
} 

Любая помощь будет оценена.

+1

Что мешает вам продолжать? –

+1

Вам нужно использовать циклы, две вложенные * для * циклов, вероятно, самые простые интуитивные. Разве вы еще не научились перебирать массивы с помощью * for * петель? – hyde

ответ

1

как этот

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int getRows(FILE *fp){ 
    int ch, rows = 0, notTop = 0; 
    while((ch = getc(fp))!= EOF){ 
     if(ch == '\n'){ 
      ++rows; 
      notTop = 0; 
     } else 
      notTop = 1; 
    } 
    if(notTop) 
     ++rows; 
    rewind(fp); 
    return rows; 
} 

int getCols(FILE *fp){ 
    int ch, cols = 0, preSpace = 1; 
    while((ch = getc(fp))!= EOF && ch != '\n'){ 
     if(isspace(ch)){ 
      preSpace = 1; 
     } else { 
      if(preSpace) 
       ++cols; 
      preSpace = 0; 
     } 
    } 
    rewind(fp); 
    return cols; 
} 

int main(void){ 
    int rows, cols; 
    FILE *fp = fopen("H.txt", "r"); 
    if (!fp){ 
     perror("can't open H.txt\n"); 
     return EXIT_FAILURE; 
    } 
    rows = getRows(fp); 
    cols = getCols(fp); 
    int (*H)[cols] = malloc(sizeof(int[rows][cols])); 
    if(!H){ 
     perror("fail malloc\n"); 
     exit(EXIT_FAILURE); 
    } 
    for(int r = 0; r < rows; ++r){ 
     for(int c = 0; c < cols; ++c){ 
      if(EOF==fscanf(fp, "%d", &H[r][c])){ 
       fprintf(stderr, "The data is insufficient.\n"); 
       free(H); 
       exit(EXIT_FAILURE); 
      } 
     } 
    } 
    fclose(fp); 
    //test print 
    for(int r = 0; r < rows; ++r){ 
     for(int c = 0; c < cols; ++c){ 
      printf("%d ", H[r][c]); 
     } 
     puts(""); 
    } 

    free(H); 
    return 0; 
} 
0

Существует много способов решить вашу проблему. Один очень простой способ состоял бы в том, чтобы иметь две петли, одну вложенную внутри другой. Внешний для строк и внутренний для столбцов. Во внутреннем цикле вы читаете одно число и храните в правильном месте вашей матрицы.

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