关于C语言读取数据到TXT

zjr448948193 2016-08-25 07:53:54
#include <stdio.h>
#define A 34
#define B 3

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++)
fscanf(fp,"%ld",&data[i][j]);
}
fclose(fp);
for(int i = 0;i<5;i++)
{
for(int j = 0;j<5;j++)
{
printf("data[%d][%d]=%ld\n" , i,j,data[i][j]);
}
}
system("pause");
return 0;
}

下面是用到的data.txt和运行结果,求大神来分析一下为什么结果和实际不一样
...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-29
  • 打赏
  • 举报
回复
仅供参考:
#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;
}
赵4老师 2016-08-26
  • 打赏
  • 举报
回复
仅供参考:
//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

小灸舞 版主 2016-08-26
  • 打赏
  • 举报
回复
你这个数组申请的就有问题。
1.用的是char
2.长度也不对,A和B应该是35和4才对
ZiSheng 2016-08-26
  • 打赏
  • 举报
回复
你的程序问题多。

#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;
}
zjr448948193 2016-08-26
  • 打赏
  • 举报
回复
引用 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格式读取嘛
赵4老师 2016-08-26
  • 打赏
  • 举报
回复
#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;
}
赵4老师 2016-08-26
  • 打赏
  • 举报
回复
#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;
}
zjr448948193 2016-08-26
  • 打赏
  • 举报
回复
引用 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

想将数据读取成二维数组怎么调整,希望能再指教一下
HaQiaME 2016-08-25
  • 打赏
  • 举报
回复
不知道你预期的结果是什么。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与指针。会对这块知识有更加深刻的理解

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧