Hướng dẫn read matrix from file c++ - đọc ma trận từ tệp c ++

Nếu trình biên dịch của bạn hỗ trợ VLA hoặc bạn đang sử dụng C99, thì bạn có thể làm điều này:

#include 

int readmatrix(size_t rows, size_t cols, int (*a)[cols], const char* filename)
{

    FILE *pf;
    pf = fopen (filename, "r");
    if (pf == NULL)
        return 0;

    for(size_t i = 0; i < rows; ++i)
    {
        for(size_t j = 0; j < cols; ++j)
            fscanf(pf, "%d", a[i] + j);
    }


    fclose (pf); 
    return 1; 
}

int main(void)
{
    int matrix[2][3];

    readmatrix(2, 3, matrix, "file.dat");

    for(size_t i = 0; i < 2; ++i)
    {
        for(size_t j = 0; j < 3; ++j)
            printf("%-3d ", matrix[i][j]);
        puts("");
    }

    return 0;
}

file.dat Trông như thế này:

1 2 3
4 5 6

và đầu ra của chương trình của tôi là

$ ./a 
1   2   3   
4   5   6   

Lưu ý rằng đây là một ví dụ cơ bản, bạn nên luôn luôn kiểm tra giá trị trả về của fscanf. Nếu file.dat chỉ có một hàng, thì bạn sẽ gặp rắc rối. Ngoài ra, không có số trong tệp, bạn cũng sẽ nhận được các giá trị không xác định trong ma trận.

Tôi khuyên bạn nên đọc toàn bộ dòng với

1 2 3
4 5 6
0 và sau đó phân tích dòng bằng
1 2 3
4 5 6
1 hoặc một số chức năng khác như
1 2 3
4 5 6
2, thì sẽ dễ dàng phản ứng với các lỗi trong tệp đầu vào sẽ dễ dàng hơn.


chỉnh sửa

Một cách mạnh mẽ hơn để đọc một tệp như thế này:

#include 
#include 
#include 
#include 


int **readmatrix(size_t *rows, size_t *cols, const char *filename)
{
    if(rows == NULL || cols == NULL || filename == NULL)
        return NULL;

    *rows = 0;
    *cols = 0;

    FILE *fp = fopen(filename, "r");

    if(fp == NULL)
    {
        fprintf(stderr, "could not open %s: %s\n", filename, strerror(errno));
        return NULL;
    }

    int **matrix = NULL, **tmp;

    char line[1024];

    while(fgets(line, sizeof line, fp))
    {
        if(*cols == 0)
        {
            // determine the size of the columns based on
            // the first row
            char *scan = line;
            int dummy;
            int offset = 0;
            while(sscanf(scan, "%d%n", &dummy, &offset) == 1)
            {
                scan += offset;
                (*cols)++;
            }
        }

        tmp = realloc(matrix, (*rows + 1) * sizeof *matrix);

        if(tmp == NULL)
        {
            fclose(fp);
            return matrix; // return all you've parsed so far
        }

        matrix = tmp;

        matrix[*rows] = calloc(*cols, sizeof *matrix[*rows]);

        if(matrix[*rows] == NULL)
        {
            fclose(fp);
            if(*rows == 0) // failed in the first row, free everything
            {
                fclose(fp);
                free(matrix);
                return NULL;
            }

            return matrix; // return all you've parsed so far
        }

        int offset = 0;
        char *scan = line;
        for(size_t j = 0; j < *cols; ++j)
        {
            if(sscanf(scan, "%d%n", matrix[*rows] + j, &offset) == 1)
                scan += offset;
            else
                matrix[*rows][j] = 0; // could not read, set cell to 0
        }

        // incrementing rows
        (*rows)++;
    }

    fclose(fp);

    return matrix;
}

int main(void)
{

    size_t cols, rows;
    int **matrix = readmatrix(&rows, &cols, "file.dat");

    if(matrix == NULL)
    {
        fprintf(stderr, "could not read matrix\n");
        return 1;
    }


    for(size_t i = 0; i < rows; ++i)
    {
        for(size_t j = 0; j < cols; ++j)
            printf("%-3d ", matrix[i][j]);
        puts("");

    }


    // freeing memory
    for(size_t i = 0; i < rows; ++i)
        free(matrix[i]);
    free(matrix);

    return 0;
}

Bây giờ file.dat trông như thế này:

1 2 3 4 
4 5 6 5 
9 8 8 7 
5 5 5 5 
1 1 1 1 

Và đầu ra là

1   2   3   4   
4   5   6   5   
9   8   8   7   
5   5   5   5   
1   1   1   1   

Trong ví dụ này, tôi chỉ tính số lượng cột cho cột đầu tiên và sử dụng số đó cho tất cả các cột khác. Nếu tệp đầu vào có các hàng có ít cột hơn hàng đầu tiên, thì các giá trị bị thiếu được lưu trữ bằng 0. Nếu nó có hàng có nhiều cột hơn hàng sẽ được cắt.

Tôi tính toán số lượng hàng như thế này:

            while(sscanf(scan, "%d%n", &dummy, &offset) == 1)
            {
                scan += offset;
                (*cols)++;
            }

Đầu tiên tôi khai báo một con trỏ

1 2 3
4 5 6
4 để trỏ đến
1 2 3
4 5 6
5, để tôi có thể sửa đổi con trỏ mà không mất dòng gốc.
1 2 3
4 5 6
6 trong
1 2 3
4 5 6
1 không được tính trong số lượng chuyển đổi thành công, điều này trả về vị trí của
1 2 3
4 5 6
4 khi nó ngừng đọc. Tôi đã sử dụng nó để lặp
1 2 3
4 5 6
1. Tôi kiểm tra rõ ràng rằng
1 2 3
4 5 6
1 trả về 1 và nếu đó là trường hợp, tôi sẽ tăng số lượng cột và tôi cập nhật
1 2 3
4 5 6
4 để cập nhật đến điểm mà
1 2 3
4 5 6
1 đã dừng đọc. Điều này cho phép tôi tiếp tục quét cho đến khi kết thúc dòng. Tôi sử dụng một kỹ thuật tương tự để phân tích tất cả các số nguyên.

Làm thế nào để đọc từ tệp văn bản và lưu trữ trong ma trận trong c?

Hiển thị hoạt động trên bài đăng này ...
fscanf ("%c", ...) ....
printf ("\ n", ...): bạn quên sử dụng bất kỳ chuỗi định dạng nào như %d (int), %f (float) ... ....
int ** mat = malloc (1000000*sizeof (int)); Bạn đang phân bổ một mảng int*ở đây, vì vậy nó phải là int ** mat = malloc (1000000*sizeof (int*)) ;.

Làm thế nào để in một ma trận trong tệp txt trong c?

Để viết phần tử ma trận vào tệp văn bản, chúng tôi sẽ sử dụng chức năng của FPRINTF.Đối với phần tử ma trận đọc từ tệp văn bản, chúng tôi sẽ sử dụng chức năng FS FSCANF.fprintf (): Nó ghi dữ liệu được định dạng vào tệp.Cú pháp là fprintf (file *ptr, const char *định dạng, trên mạng).use the “fprintf” function. For the reading matrix element from the text file, we will use the “fscanf” function. fprintf(): It writes formatted data to the file. The syntax is fprintf(FILE *ptr, const char *format, …).

Làm thế nào để bạn đọc một ma trận?

Kích thước của ma trận là số lượng hàng theo số lượng cột.Nếu một ma trận có một hàng và cột B, thì đó là ma trận A × B.Ví dụ, ma trận đầu tiên được hiển thị bên dưới là ma trận 2 × 2;Cái thứ hai là ma trận 1 × 4;và cái thứ ba là ma trận 3 × 3.. If a matrix has a rows and b columns, it is an a×b matrix. For example, the first matrix shown below is a 2×2 matrix; the second one is a 1×4 matrix; and the third one is a 3×3 matrix.

Làm cách nào để mở tệp .matrix?

Biểu tượng thanh công cụ hoặc làm theo các bước sau:..
Mở menu tệp ..
Chọn Mở ..
Chọn loại tệp mà bạn muốn mở ..
Duyệt đến vị trí của tệp.Chọn nó, và nhấp vào Mở.Ban đầu, duyệt web bắt đầu trong vị trí biến người dùng được chỉ định trong hộp thoại Tùy chọn ..