如何用C语言讲文本文件中储存的数据读入一个二维数组

比如说我在一份文本文件中存有如下格式的数据
1 0.2 0.16 0.6 0.458 0.432
2 0.44 0.58 0.7 5.5 6.42
3 1.458 2.45 8.12 244 1.02
每行第一个数字是序号,后面的每个数字用空格分隔开
文件存储在D:\\GLUE\\0818.txt
我写了一点程序,但是不对。希望高手指点。
int main(int argc, char *argv[])
int i = 0;
char line[1000]; # maximum characters stored in a line
char wLine[1000];
double SIMUL[100][100];
int lineCount = 0;
Fsimul.file = NULL;
if ((Fsimul.file = fopen("D:\\GLUE\\0818.txt","rt")) == NULL break;

while ( fgets(line, MAXLINE, Fsimul.file) != NULL )
{
// --- make copy of line and scan for tokens
lineCount++;
strcpy(wLine, line);

for (j = 0; j < 5; j++)
{
SIMUL[i][j] = strtod(wLine, NULL);
i++;
}
..................................
如何跳过序号,只把序号后面的数写入数组中呢?谢谢啦

此代码符合你的要求:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
FILE *fp;
char line[1000];
char wLine[1000];
double SIMUL[100][100];
int lineCount = 0;
char *delim=" ";
int ii,jj;

fp = fopen("1.txt","r");
if( fp==NULL){
printf("fopen error!\n");
return -1;
}

memset(line,0x00,sizeof(line));
while(fgets(line,1000,fp)!=NULL){
strtok(line,delim);
for(ii=0;ii<5;ii++){
SIMUL[lineCount][ii] = atof(strtok(NULL,delim));
}
lineCount++;
}
fclose(fp);

//打印结果
for(ii=0;ii<lineCount;ii++){
for(jj=0;jj<5;jj++){
printf("%f ",SIMUL[ii][jj]);
}
printf("\n");
}

return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-31
自己试试看,下午无聊给你做了一下,我在linux下面跑起来是可以的
完全满足你的最终要求,忽略掉了行号,记录真实数据到二维数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int localize(char *buf);
void linechg(double *dest, char *sour);
main()
{
FILE *f1;
int i=0,j=0,k=0,len_f1;
double dest[100];
char sour[100];
double SIMUL[100][100];

f1=fopen("k2","rt");//改为你自己的路径

if(f1==NULL)
{
printf("Fail to open the source file!\n");
return 2;
}
while(1){
if(fgets(sour,100,f1)==NULL)
return 1; //input complete
else
{
linechg(dest, sour);//做单行的处理
strncpy(SIMUL[i],dest,5);
printf("\n");
}
}
fclose(f1);
for(i=0;i<5;i++)
printf("%lf",SIMUL[i]);
return 0;

}
/*
定位空格(实际上就是定位下一个浮点数起始位置)*/
int localize(char *buf)
{
int i;
for(i=1;i<1024;i++)
{
if(buf[i]==' ')
break;
else if((buf[i]=='\n')||(buf[i]==EOF))//analyse completely
{
i=0;
break;
}
}
return i;
}

void linechg(double *dest, char *sour)
{
int i=1,j=0,k=0;

for(k=0;k<5;k++)
{
i=localize(sour+j);
if(i==0) break;
j+=i;//current new location
dest[k]=strtod(sour+j,NULL);
printf("%lf ",dest[k]);
}

}
第2个回答  2010-08-31
我只能基本上推翻你写的所有程序了,因为你没有实际进行剔除第一个数的操作

#include <stdio.h>
int main(int argc, char *argv[])
{
double SIMUL[100][100];
char line[1000];
int i = 0;
int trush; //用于存放每行第一个数,但没有实际作用
FILE *Fsimul = NULL;
if((Fsimul = fopen("D:\\GLUE\\0818.txt","rt")) == NULL)
return -1;
while ( fgets(line, 1000, Fsimul) != NULL )
{
sscanf(line, "%d %lf %lf %lf %lf %lf", &trush, &SIMUL[i][0], &SIMUL[i][1], &SIMUL[i][2], &SIMUL[i][3], &SIMUL[i][4]);
//根据你写的部分程序来看,每行都是有固定的5个数需要录入到数组中,那么这样用sscanf会方便很多
i++; //每行录入完毕后自加进入下一行的录入
}
return 0;
}
第3个回答  推荐于2016-08-23
#include<stdio.h>
#include<string.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    int i = 0;
    double data[100][5];
    char str[100];
    
    fp = fopen("F:/112.txt", "r"); //打开文件
    if (!fp)
        return -1;
    
    while (!feof(fp)) // 读取数据
    {
        fgets(str, 100, fp);
        strtok(str, " ");
        for (int n = 0; n < 5; n++) // 截取数据
            data[i][n] = atof(strtok(NULL, " "));
        i++;
    }
    fclose(fp);
    
    for (int r = 0; r < i; r++) // 打印数据
    {
        for (int n = 0; n < 5; n++)
            printf("%lf ", data[r][n]);
        printf("\n");
    }
}

第4个回答  2010-08-30
文本文件中的数据格式如果能自己控制, 并且是固定的话, 完全可以通过#include, 让编译器来帮你读入....
相似回答