user-0 提问: 关于C语言读取数据到TXT

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }

user: user-1
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-2
content: 你这个数组申请的就有问题。 1.用的是char 2.长度也不对，A和B应该是35和4才对

user: user-3
content: 你的程序问题多。  #include <stdio.h> #define A 34 #define B 30   int main() {     char data[A][B];       FILE *fp;//文件指针     fp = fopen("data.txt","r+");//打开TXT文件     if(!fp)         printf("不能找到data.TXT!");//判断是否能打开文件     for(int i=0;i<20;i++)     {         for(int j=0;j<5;j++)             fprintf(fp,"%ld",data[i][j]);//注意使用fprintf,并且data[i][j]，不能取地址     }     fclose(fp);     for(int m = 0;m<20;m++)     {         for(int n = 0;n<5;n++)         {             printf("data[%d][%d]=%ld\n" , m,n,data[m][n]);         }     }     //system("pause");     return 0; }

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:#include <stdio.h> #define A 35 #define B 4 int main() {     int data[A][B];      FILE *fp;     fp=fopen("data.txt","r");     if(!fp) {         printf("不能找到data.TXT!");         return 1;     }     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             fscanf(fp,"%d",&data[i][j]);     fclose(fp);     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             printf("data[%d][%d]=%d\n",i,j,data[i][j]);     system("pause");     return 0; }  你好，对于既有整数又有小数的是用%f格式读取嘛

user: user-1
content: #include <stdio.h> #define A 35 #define B 4 int main() {     int data[A][B];      FILE *fp;     fp=fopen("data.txt","r");     if(!fp) {         printf("不能找到data.TXT!");         return 1;     }     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             fscanf(fp,"%d",&data[i][j]);     fclose(fp);     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             printf("data[%d][%d]=%d\n",i,j,data[i][j]);     system("pause");     return 0; }

user: user-1
content: #include <stdio.h> #define A 35 #define B 4 int main() { 	int	data[A][B];  	FILE *fp; 	fp = fopen("data.txt","r"); 	if(!fp)	{ 		printf("不能找到data.TXT!");         return 1;     } 	for(int	i=0;i<A;i++) 		for(int	j=0;j<B;j++) 			fscanf(fp,"%d",&data[i][j]); 	fclose(fp); 	for(int	i =	0;i<A;i++) 		for(int	j =	0;j<B;j++) 			printf("data[%d][%d]=%d\n" , i,j,data[i][j]); 	system("pause"); 	return 0; }

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8   想将数据读取成二维数组怎么调整，希望能再指教一下

user: user-4
content: 不知道你预期的结果是什么。B的值是3。所以数据的第二个下标有效值最大是2。事实上data〔0〕〔3〕保存的位置其实是data［1］［0］,而data［0］［4］是保存在data［1］［1］中，这样4,和5分别就保存在data［1］［0］和data［1］［1］处，这样当循环到i为1，j为0时，6便被保存在data［1］［0］处。所以会是这样的结果。。。。。。二维数组的保存其实也是连续的。额，可以看看c与指针。会对这块知识有更加深刻的理解