1个回答
展开全部
假定数据全是整型数,用空白分隔,不知道有几行几列。
那么可以先用程序数一下共有多少个数。
然后,找满足 行数 * 列数 == 共有这么多个数 的行数,列数。
动态分配2 维数组,读入数据。
程序如下:
// 前2行是c++要的附加头文件,去掉这2行就是纯c程序
#include<iostream>
using namespace std;
#include <stdio.h>
FILE *fin;
int **a;
main()
{
int n;
int i,j,nx,ny;
fin = fopen("abc.txt","r"); // 数据文件名 abc.txt
if (!fin){
printf("Can not open the file\n");
return 1;
}
n=0;
while(1){
if (fscanf(fin,"%*d")==EOF) break; //统计数据个数
n++;
}
for (i=2;i<=n;i++){
if (n%i == 0) {nx=i;ny=n/i; break;}; //得出行列
}
printf("row=%d col=%d\n",ny,nx);
a = (int **) malloc(sizeof(int *) * ny); //动态分配
for (j=0;j<ny;j++){
a[j] = (int *) malloc(sizeof(int) * nx);
}
if (!a){ printf("no enough memory for alloc\n"); return 2;};
rewind(fin); //回绕文件
for (j=0;j<ny;j++) for (i=0;i<nx;i++) fscanf(fin,"%d",&a[j][i]); //读入数据
fclose(fin);
for (j=0;j<ny;j++){
for (i=0;i<nx;i++) printf("%d ",a[j][i]);
printf("\n");
}
return 0;
}
例如输入文件内容:
1
2 3
4 5 6 7
8 9
输出:
row=3 col=3
1 2 3
4 5 6
7 8 9
那么可以先用程序数一下共有多少个数。
然后,找满足 行数 * 列数 == 共有这么多个数 的行数,列数。
动态分配2 维数组,读入数据。
程序如下:
// 前2行是c++要的附加头文件,去掉这2行就是纯c程序
#include<iostream>
using namespace std;
#include <stdio.h>
FILE *fin;
int **a;
main()
{
int n;
int i,j,nx,ny;
fin = fopen("abc.txt","r"); // 数据文件名 abc.txt
if (!fin){
printf("Can not open the file\n");
return 1;
}
n=0;
while(1){
if (fscanf(fin,"%*d")==EOF) break; //统计数据个数
n++;
}
for (i=2;i<=n;i++){
if (n%i == 0) {nx=i;ny=n/i; break;}; //得出行列
}
printf("row=%d col=%d\n",ny,nx);
a = (int **) malloc(sizeof(int *) * ny); //动态分配
for (j=0;j<ny;j++){
a[j] = (int *) malloc(sizeof(int) * nx);
}
if (!a){ printf("no enough memory for alloc\n"); return 2;};
rewind(fin); //回绕文件
for (j=0;j<ny;j++) for (i=0;i<nx;i++) fscanf(fin,"%d",&a[j][i]); //读入数据
fclose(fin);
for (j=0;j<ny;j++){
for (i=0;i<nx;i++) printf("%d ",a[j][i]);
printf("\n");
}
return 0;
}
例如输入文件内容:
1
2 3
4 5 6 7
8 9
输出:
row=3 col=3
1 2 3
4 5 6
7 8 9
追问
我的意思是那些数据是以矩阵排列的,但是我不知道有几行几列,要把数据按照排列的顺序放进二维数组中
追答
整齐排列的,数一下第一行有几个数,就是 nx. 再数总个数,算出行。
int c,flag=0; //另加声明变量
fin = fopen("abc.txt","r");
if (!fin){ printf("Can not open the file\n"); return 1; }
//增加一段程序,第一行数数:
nx=0;
while(1){
if (fscanf(fin,"%*d")==EOF) break;
c = getc(fin);
while (c==' ') c = getc(fin);
if (c=='\n'){flag=1;break;} else ungetc(c,fin);
nx++;
}
rewind(fin);
//
n=0;
while(1){
if (fscanf(fin,"%*d")==EOF) break;
n++;
}
ny=n/nx; // 改为计算出 ny
printf("row=%d col=%d\n",ny,nx);
以下不变。
===========
这样写程序的好处是当一行数据很多,例如超出4096字节或更多时,都不怕。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询