Как ввести файл данных в 2D массив - PullRequest
3 голосов
/ 23 ноября 2011

У меня есть файл, который мне нужно сохранить в двумерном массиве, чтобы я мог выполнять над ним матричные операции.Все, что я знаю, это то, что двойники будут разделены пробелами и переносами строк, например:

2.04 3.0 4.0
5.0 6.1 7.0
8.0 9.03 10.0

Я не буду знать, сколько будет чисел, поэтому мне нужна масштабируемая функция синтаксического анализа.Пока у меня есть:

int main(int argc, char* argv[])
{
    FILE *fp;
    char ch;
    fp = fopen("matrix.dat","r");
    if ( fp == NULL )
    {
        puts ( "Cannot open source file");
    }

    /*count the number of lines*/
    int lines=1;
    char c;
    while((c = fgetc(fp)) != EOF)
    {
        if(c == '\n')
            lines++;
    }
    printf("lines= %i\n",lines);

    /*reopen the file to reset the pointer*/
    fclose(fp);
    fp = fopen("matrix.dat","r");
    double m[lines][lines];

    /*Load file into array*/
    int i,j;
    for(i=0;i<lines;i++)
    {
        for(j=0;j<lines;j++)
        {
            fscanf( fp, "%lf", &(m[i][j]));
        }
        fscanf(fp, "\n", NULL);
    }

    /*print out stored matrix*/
    for(i=0;i<lines;i++)
    {
        for(j=0;j<lines;j++)
        {
            printf("%lf ",m[i][j]);
        }
        printf("\n");
    }
}

Мои проблемы с этим методом:

  1. Предполагается, что число строк равно числу двойных чисел в строке, чтоможет быть неверным. **

  2. Любые пропущенные двойные числа в файле приведут к загрузке неверной матрицы в память (оставшиеся значения смещены на 1).

  3. В настоящее время я загружаю файл в память дважды, чтобы сосчитать строки.

Есть ли более разумный способ ввода этих данных в двумерный массив?Мне нужно убедиться, что входная матрица квадратная и что моя программа может обрабатывать квадратную матрицу любого порядка.Я довольно новичок в C, поэтому примеры и функции именования будут высоко оценены :) (Извиняюсь за изворотливый отступ)

** Извините за столь расплывчатую информацию, я хотел немного обработать ошибки, т.е. убедиться, чтоввод не принимается, если нет ровно nxn двойников.

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

Как и Николаю, мне любопытно, что вы подразумеваете под точкой (1) ... если матрица квадратная, то не будет ли число строк всегда равным количеству двойных чисел в строке? Если нет, то, я полагаю, вы можете просмотреть в файле строку с наибольшим количеством значений.

Вот ваш код, модифицированный для этого:

/* count the number of lines */
int lines = 1;
int maxValues = 0;
int count = 0;
char junk;
while((junk == fgetc(fp)) != EOF) {
    if(junk == '\n') {
        lines++
        if(maxValues <= count) {
            maxValues = ++count;
        }
        count = 0;
    }
    else if(junk == 0x20) {
        count++;
    }
}

Для адреса точки (2), возможно, попробуйте эту модификацию:

/* load file into array */
int i, j;
for(i = 0; i < lines; i++) {
    j = 0;
    do {
        fscanf(fp, "%lf", &(m[i][j]));
        j++;
    } while((junk = fgetc(fp)) != '\n');
}

Наконец, для пункта (3) я почти уверен, что вы можете использовать rewind(fp); для сброса указателя на начало файла.

0 голосов
/ 23 ноября 2011
  • читать первую строку с fgets
  • считать значения, скажем, они n
  • сделать массив из n * n
  • читать n - 1 строки n значений каждый
  • вычислять обратное

Вуаля!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...