我有一个看起来像这样的文本文件(H.txt):
1 0 1 1 0 1
0 0 1 1 0 0
0 0 0 1 0 0
1 1 1 0 0 0
我需要将这个文本文件读入一个名为H的2D数组中。文本文件的大小可以在长度和宽度上改变(即,可以有比上面的示例更多的行和更多列的二进制数据)
到目前为止我所拥有的:
#import <stdio.h>
int main()
{
int m = 4;
int n = 6;
int H[m][n];
FILE *ptr_file;
char buf[1000];
ptr_file = fopen("H.txt", "r");
if (!ptr_file)
return 1;
fscanf(ptr_file,"%d",H);
fclose(ptr_file);
return 0;
}
任何帮助都将不胜感激。
答案 0 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int getRows(FILE *fp){
int ch, rows = 0, notTop = 0;
while((ch = getc(fp))!= EOF){
if(ch == '\n'){
++rows;
notTop = 0;
} else
notTop = 1;
}
if(notTop)
++rows;
rewind(fp);
return rows;
}
int getCols(FILE *fp){
int ch, cols = 0, preSpace = 1;
while((ch = getc(fp))!= EOF && ch != '\n'){
if(isspace(ch)){
preSpace = 1;
} else {
if(preSpace)
++cols;
preSpace = 0;
}
}
rewind(fp);
return cols;
}
int main(void){
int rows, cols;
FILE *fp = fopen("H.txt", "r");
if (!fp){
perror("can't open H.txt\n");
return EXIT_FAILURE;
}
rows = getRows(fp);
cols = getCols(fp);
int (*H)[cols] = malloc(sizeof(int[rows][cols]));
if(!H){
perror("fail malloc\n");
exit(EXIT_FAILURE);
}
for(int r = 0; r < rows; ++r){
for(int c = 0; c < cols; ++c){
if(EOF==fscanf(fp, "%d", &H[r][c])){
fprintf(stderr, "The data is insufficient.\n");
free(H);
exit(EXIT_FAILURE);
}
}
}
fclose(fp);
//test print
for(int r = 0; r < rows; ++r){
for(int c = 0; c < cols; ++c){
printf("%d ", H[r][c]);
}
puts("");
}
free(H);
return 0;
}
答案 1 :(得分:0)
有很多方法可以解决您的问题。一种非常简单的方法是有两个循环,一个嵌套在另一个循环中。线条的外部和列的内部。在内部循环中,您读取一个数字并存储到矩阵的正确位置。