我试图读取一个存有矩阵的文件。在我的源文件中,我有一个大小为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行,依此类推。
答案 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);
}