使用fread在单个缓冲区中读取2d数组的不同行

时间:2016-11-13 23:51:03

标签: c matrix file-io

我试图读取一个存有矩阵的文件。在我的源文件中,我有一个大小为rows*cols的缓冲区。矩阵以行主要顺序存储。我想用fread以这种方式读入矩阵的行:

buf [0..row-1] =第一行

buf [row .. 2row-1] =第二行

等等。是否可以使用fread来执行此操作?如果没有其他替代品?

所以这就是我在代码方面所写的内容:

for(k = 0; k<row*cols;k++)
{
fread(buf,sizeof(double), row*cols*k,&fp);

}

但是,正如我在上面的伪代码中提到的,我希望buf[0..row-1]包含第0行,buf[row..2row-1]包含第2行,依此类推。

1 个答案:

答案 0 :(得分:2)

示例代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>

int main(void){
    int rows = 4, cols = 3;
    double matrix[rows][cols];
    double buf[rows*cols];
    assert(sizeof(matrix) == rows*cols*sizeof(double));

    srand(time(NULL));
    //make matrix
    puts("original matrix");
    for(int r = 0; r < rows; ++r){
        for(int c = 0; c < cols; ++c){
            matrix[r][c] = (double)rand()/RAND_MAX;
            printf("%f ", matrix[r][c]);
        }
        puts("");
    }

    //write file
    FILE *fp = fopen("data.dat", "wb");
    fwrite(matrix, sizeof(matrix), 1, fp);
    fclose(fp);

    //read file to 1D buf
    fp = fopen("data.dat", "rb");
    fread(buf, sizeof(double), rows*cols, fp);
    fclose(fp);

    puts("\nread matrix as 1D");
    for(int r = 0; r < rows; ++r){
        for(int c = 0; c < cols; ++c){
            printf("%f ", buf[r * cols + c]);
        }
        puts("");
    }

    double buf_of_one_row[cols];
    //read file each row
    fp = fopen("data.dat", "rb");
    puts("\nread matrix as 1D each row");
    for(int r = 0; r < rows; ++r){
        fread(buf_of_one_row, sizeof(double), cols, fp);
        for(int c = 0; c < cols; ++c){
            printf("%f ", buf_of_one_row[c]);
        }
        puts("");
    }
    fclose(fp);
}