User-14784327 Ответов: 1

Проблема с чтением и записью в файл на языке Си


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

Моя проблема в том, что он не пишет и, наверное, не читает матрицу, потому что я ничего не вижу в выходном файле.

Вот код, который я написал::
#include "matrix.h"
#include <stdio.h>
#include <stdlib.h>
int main(void){
        FILE *file;
        file = fopen("input.dat","r");
        if(file == NULL)
        {
        printf("Error opening file!\n");
        exit(1);
        }
        int **m;
        m = (int**) malloc(noOfRows * sizeof(int *));
        for(i = 0; i < noOfRows; i++)
        {
                m[i] = (int*) malloc(noOfRows * sizeof(int));
        }
        for(i = 0; i < noOfRows; i++)
        {
                for(j = 0; j < lenghtRows; j++)
                {
                        fscanf(file,"%d", &m[i][j]);
                }
        }
        for(i = 0; i < noOfRows ;++j)
        {
                for(j = 0; j < lenghtRows;++j)
                { for(k=(j+1);k < lenghtRows; ++k)
                        {
                        if (m[i][j] > m[i][k]){
                        swap(m, noOfRows, lenghtRows,i, i + 1);
                        }
                        }
                }
        }
        fclose(file);
        for(i = 0; i < noOfRows; ++i)
        {
                for(j = 0; j < lenghtRows;++j) {
                        printf(" %d", m[i][j]);
        }
                printf("\n");
        }
        FILE *p;
        p = fopen("output.dat", "w");
        if(p == NULL)
        {
         printf("Error opening file!\n");
         exit(1);
        }
        for(i = 0; i < noOfRows; ++i)
        {
                for(j = 0; j < lenghtRows; ++j)
                {
                        fprintf(p, "%d", m[i][j]);
                }
                fprintf(p,"\n");
        }
        fclose(p);
}


Что я уже пробовал:

Там нет кода ошибки, и я перепробовал все. Я использую заголовочный файл и другой файл .c, где находится эта функция, а также использую makefile.

Пожалуйста, кто-нибудь может мне помочь?

Gerry Schmitz

Пусть ваша программа первым делом напечатает "Привет, мир!". Если вы не зашли так далеко, вы задаете неправильный вопрос.

1 Ответов

Рейтинг:
2

Rick York

What you have here is a monolithic program - there is one function. That is only reasonable for the most trivial of programs and, in my opinion, your program is not quite trivial enough for that to be acceptable. For this reason, I think you need to break this into functions. This will also help you sort things out because you can focus on and debug one thing at a time. This needs to be broken into a series of functions. I would make one function to read the file and create the matrix. The creation of the matrix should also be its own function and there needs to be a corresponding matrix free function the releases all the memory it allocated. Then you should make a function to sort the matrix and one to write the matrix. The matrix writer should take a file object pointer as an argument so you can pass it a handle to an open file to write it or pass it stdout to display it in your console. BTW - you know that "printf" and "fprintf to stdout" are essentially the same thing, right?

У вас есть весь код для каждой из этих функций, поэтому просто нужно вызвать их соответствующим образом. Самое трудное, вероятно, будет разобраться, как распределить вашу матрицу. Ответ прост - вы передаете аргумент типа "int**", так как именно так вы объявили m. Как только вы разберетесь с этими функциями и их прототипами ваша основная функция должна выглядеть примерно так :

int main(void)
{
    const char * inputFile = "input.dat";
    const char * outputFile = "output.dat";
    FILE *pfile = nullptr;
    int **m = nullptr;

    m = ReadMatrix( inputFile );   // read the file and allocate the matrix
    if( ! m )
        return -1;    // failed to read the file

    printf( "file %s was read - matrix is :\n", inputFile );
    WriteMatrix( m, stdout );

    SortMatrix( m );

    printf( "sorted matrix is :\n" );
    WriteMatrix( m, stdout );
   
    pfile = fopen( outputFile, "w");
    if( ! pfile )
    {
       fprintf( stderr, "Error opening file '%s'!\n", outputFile );
       return -1;
    }

    WriteMatrix( m, pfile );
    fclose( pfile );

    printf( "file %s was written\n", outputFile );

    ReleaseMatrix( m );

    printf( "matrix was released - sayonara\n" );
    return 0;
}
Таким образом, вам нужно написать четыре функции, и у вас уже есть код для всех из них. Теперь вы можете сосредоточиться на отладке каждого из них, как они называются в вашей программе. Если вы разделите создание матрицы и чтение файла на две функции, то у вас будет пять функций.

Так пишутся более крупные программы и библиотеки - вы разбиваете код на компоненты, которые потенциально могут использоваться много раз в разных местах.

-редактировать-

Я вижу, что noOfRows приходит откуда-то еще. Это означает, что вы можете легко отделить чтение и распределение матрицы.


User-14784327

Спасибо за решение, но, пожалуйста, не могли бы вы включить и эти функции? Я немного новичок в языке Си.

Rick York

Теперь у вас уже есть код для всех функций. Вам просто нужно сделать объявления для них и добавить код. Вы можете видеть, как они вызываются в решении, и вы знаете типы всех аргументов - вы просто передаете их точно так, как они объявлены. Например, WriteMatrix принимает указатель на файловый объект и матрицу. Указатель на файл-это файл*, а матрица-это int**, так что это то, что вы передаете ему. Он не имеет возврата интереса, поэтому его прототип будет выглядеть следующим образом : void WriteMatrix( int **matrix, FILE * fp );

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

User-14784327

Я этого не понимаю и не могу сделать. Но спасибо за ответы.