user-0 提问: 尝试C语言程序读取txt文件并把其中数据输入结构体组中，但是一直“屯屯屯”

回复:
user: user-1
content: 引用 10 楼 asdfghjkl5411 的回复:请问_ftscanf_s()的头文件是什么。。我查了但是没有查到，UNIT也不知道是什么，，我太菜了真是不好意思 #include <tchar.h>

user: user-2
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: %31[^\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-1
content: 抱歉 缓冲大小应该是in bytes不是字符个数 上面参数依照文档种例子 是错误的 在Unicode文件可能出错，正确的写法是：  _ftscanf_s(fp, L"%d %s %d %f", &L->data[i].num, L->data[i].name, (UINT)sizeof(L->data[i].name), &L->data[i].age, &L->data[i].score);

user: user-1
content: 改为 fscanf_s(fp, "%d %s %d %f", &L->data[i].num, L->data[i].name, (UINT)_countof(L->data[i].name), &L->data[i].age, &L->data[i].score); 测试通过 VS2019/Win10 2004

user: user-0
content: 请问_ftscanf_s()的头文件是什么。。我查了但是没有查到，UNIT也不知道是什么，，我太菜了真是不好意思

user: user-3
content: 引用 5 楼 asdfghjkl5411 的回复:[quote=引用 3 楼 5250的回复:]void FileRead(sqlist *L) {     FILE* fp;     char filename[40];     printf("请输入文件名（在结尾加一个空格作为字符串终止符）：\n");     scanf_s("%s", &filename, 40);     printf("该文件中一共有多少组数据？");     scanf_s("%d", &L->listlen);     if ((fp = fopen(filename, "r")) == NULL)         return;     for (int i = 0; i < L->listlen; i++) {         fscanf_s(fp, "%d %s %d &f", &L->data[i].num, L->data[i].name, &L->data[i].age, &L->data[i].score);     }     printf("\n数据导入成功!");     _getch(); }   scanf_s("%s", &filename, 40);不需要加& 我改了，没有用的[/quote]  你把你的代码都贴出来吧   大伙给你运行看看

user: user-4
content: fscanf_s(fp, "%d %s %d &f", &L->data[i].num, L->data[i].name, &L->data[i].age, &L->data[i].score);     } 改成 fscanf_s(fp, "%d %s %d %f", &L->data[i].num, L->data[i].name, 20, &L->data[i].age, &L->data[i].score);     } 对于%s需要注意，scanf_s相对于scanf需要多一个参数，即缓存的长度；%c也是一样的。上面的filename楼主多加了一个参数，为什么在下面的scanf_s中不加呢？

user: user-0
content: 引用 4 楼 自信男孩的回复:fscanf_s(fp, "%d %s %d &f", &L->data[i].num, L->data[i].name, &L->data[i].age, &L->data[i].score);     } 改成 fscanf_s(fp, "%d %s %d %f", &L->data[i].num, L->data[i].name, 20, &L->data[i].age, &L->data[i].score);     } 对于%s需要注意，scanf_s相对于scanf需要多一个参数，即缓存的长度；%c也是一样的。上面的filename楼主多加了一个参数，为什么在下面的scanf_s中不加呢？ 因为忘了呀，我觉得问题应该不出在scanf_s上，应该是读文件那里的问题

user: user-0
content: 引用 3 楼 5250的回复:void FileRead(sqlist *L) {     FILE* fp;     char filename[40];     printf("请输入文件名（在结尾加一个空格作为字符串终止符）：\n");     scanf_s("%s", &filename, 40);     printf("该文件中一共有多少组数据？");     scanf_s("%d", &L->listlen);     if ((fp = fopen(filename, "r")) == NULL)         return;     for (int i = 0; i < L->listlen; i++) {         fscanf_s(fp, "%d %s %d &f", &L->data[i].num, L->data[i].name, &L->data[i].age, &L->data[i].score);     }     printf("\n数据导入成功!");     _getch(); }   scanf_s("%s", &filename, 40);不需要加& 我改了，没有用的

user: user-3
content: void FileRead(sqlist *L) {     FILE* fp;     char filename[40];     printf("请输入文件名（在结尾加一个空格作为字符串终止符）：\n");     scanf_s("%s", &filename, 40);     printf("该文件中一共有多少组数据？");     scanf_s("%d", &L->listlen);     if ((fp = fopen(filename, "r")) == NULL)         return;     for (int i = 0; i < L->listlen; i++) {         fscanf_s(fp, "%d %s %d &f", &L->data[i].num, L->data[i].name, &L->data[i].age, &L->data[i].score);     }     printf("\n数据导入成功!");     _getch(); }   scanf_s("%s", &filename, 40);不需要加&

user: user-0
content: 我也觉得是读文件那里出了问题，照您说的改了一下，还是一片的屯屯屯

user: user-5
content: 动态分配（new，malloc）而未赋初值的内存空间，用0xCD填充，如不小心访问了它们，则会看到如下内容： 按字符输出为屯（0xCDCD）  你读文件失败了吧   scanf_s("%s", &filename, 40);  好像不用&  scanf_s("%s", filename, 40);