user-0 提问: c的文件操作

回复:
user: user-0
content: 引用 2 楼 自信男孩的回复:#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; char sID[20] = "zhb_gcsj_data1.txt"; typedef struct GongZi {     long int lNum ;//工号     char sName[32];//姓名     long long int llCard;//银行卡号     int iMonth;//发工资的月份     double dYFgz;//应发工资     double dShuiDian;//水电费     double dShuiJin;//税金     char sGroup[32];//部门     double dSFgz;//实发工资     char sPS[32];//备注     bool operator < (const GongZi &x)const     {         return x.llCard>llCard;//set容器里默认按照卡号由小到大排序     } }employee; void Add() {     int iNum;     employee *p;     FILE *fp;     if((fp = fopen(sID,"a+")) == NULL){             cout << "error!" << endl;             exit(1);         }     cout << "请输入您准备添加的职工的个数:";     cin >> iNum;     p = (employee *)malloc(iNum * sizeof(employee));     for(int i = 0;i < iNum;i++){         cout << "请依次输入第" << i+1 << "位职工的信息" << endl;         cout << "请输入工号:";         cin >> p[i].lNum;         cout << "请输入姓名:";         scanf("%s",p[i].sName);         cout << "请输入银行卡号:";         cin >> p[i].llCard;         cout << "请输入发放工资的月份:";         cin >> p[i].iMonth;         cout << "请输入应发放工资的数额:";         cin >> p[i].dYFgz;         cout << "请输入应支付的水电费:";         cin >> p[i].dShuiDian;         cout << "请输入应缴纳的税金:";         cin >> p[i].dShuiJin;         cout << "请输入该员工的部门:";         scanf("%s",p[i].sGroup);         p[i].dSFgz = p[i].dYFgz - p[i].dShuiDian - p[i].dShuiJin;         cout << "请输入有关该员工的备注:";         scanf("%s",p[i].sPS);         fprintf(fp,"%ld %s %lld %d %lf %lf %lf %s %lf %s\n",p[i].lNum,p[i].sName,p[i].llCard,p[i].iMonth,                 p[i].dYFgz,p[i].dShuiDian,p[i].dShuiJin,p[i].sGroup,p[i].dSFgz,p[i].sPS);     }     free(p);     fclose(fp); } void Operate() {     int iN, ret;     employee p;     FILE *fp;     if((fp=fopen(sID,"r+"))==NULL){         cout << "error!" << endl;         exit(1);     }     ret = fscanf(fp,"%ld %s %lld %d %lf %lf %lf %s %lf %s\n",             &p.lNum,p.sName,&p.llCard,&p.iMonth,&p.dYFgz,&p.dShuiDian,&p.dShuiJin,p.sGroup,&p.dSFgz,p.sPS);     printf("ret = %d\n", ret);     while (ret == 10  && ret != EOF) {         cout << p.lNum << "\t" << p.sName << "\t" << p.llCard << "\t" << p.iMonth << "\t"         << p.dYFgz << "\t" << p.dShuiDian << "\t" << p.dShuiJin << "\t" << p.sGroup         << "\t" << p.dSFgz << "\t" << p.sPS<<endl;         ret = fscanf(fp,"%ld %s %lld %d %lf %lf %lf %s %lf %s\n",                 &p.lNum,p.sName,&p.llCard,&p.iMonth,&p.dYFgz,&p.dShuiDian,&p.dShuiJin,p.sGroup,&p.dSFgz,p.sPS);     }     fclose(fp); } int main() {     Add();     Operate();     return 0; }   供参考。 不用用,逗号，并且使用fscanf/fprintf来读取文件，如果用逗号，加以用fgets/strtok。因为逗号不能区分%s和后面的类型数据。 我将你修改的代码加入我的代码中实验发现字符串还是没法显示 但是只是用你提供这个却又可以读入字符串  之前我也用的是空格分隔 结果一直读不出来 我才改用的逗号分隔

user: user-1
content: #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; char sID[20] = "zhb_gcsj_data1.txt"; typedef struct GongZi {     long int lNum ;//工号     char sName[32];//姓名     long long int llCard;//银行卡号     int iMonth;//发工资的月份     double dYFgz;//应发工资     double dShuiDian;//水电费     double dShuiJin;//税金     char sGroup[32];//部门     double dSFgz;//实发工资     char sPS[32];//备注     bool operator < (const GongZi &x)const     {         return x.llCard>llCard;//set容器里默认按照卡号由小到大排序     } }employee; void Add() {     int iNum;     employee *p;     FILE *fp;     if((fp = fopen(sID,"a+")) == NULL){             cout << "error!" << endl;             exit(1);         }     cout << "请输入您准备添加的职工的个数:";     cin >> iNum;     p = (employee *)malloc(iNum * sizeof(employee));     for(int i = 0;i < iNum;i++){         cout << "请依次输入第" << i+1 << "位职工的信息" << endl;         cout << "请输入工号:";         cin >> p[i].lNum;         cout << "请输入姓名:";         scanf("%s",p[i].sName);         cout << "请输入银行卡号:";         cin >> p[i].llCard;         cout << "请输入发放工资的月份:";         cin >> p[i].iMonth;         cout << "请输入应发放工资的数额:";         cin >> p[i].dYFgz;         cout << "请输入应支付的水电费:";         cin >> p[i].dShuiDian;         cout << "请输入应缴纳的税金:";         cin >> p[i].dShuiJin;         cout << "请输入该员工的部门:";         scanf("%s",p[i].sGroup);         p[i].dSFgz = p[i].dYFgz - p[i].dShuiDian - p[i].dShuiJin;         cout << "请输入有关该员工的备注:";         scanf("%s",p[i].sPS);         fprintf(fp,"%ld %s %lld %d %lf %lf %lf %s %lf %s\n",p[i].lNum,p[i].sName,p[i].llCard,p[i].iMonth,                 p[i].dYFgz,p[i].dShuiDian,p[i].dShuiJin,p[i].sGroup,p[i].dSFgz,p[i].sPS);     }     free(p);     fclose(fp); } void Operate() {     int iN, ret;     employee p;     FILE *fp;     if((fp=fopen(sID,"r+"))==NULL){         cout << "error!" << endl;         exit(1);     }     ret = fscanf(fp,"%ld %s %lld %d %lf %lf %lf %s %lf %s\n",             &p.lNum,p.sName,&p.llCard,&p.iMonth,&p.dYFgz,&p.dShuiDian,&p.dShuiJin,p.sGroup,&p.dSFgz,p.sPS);     printf("ret = %d\n", ret);     while (ret == 10  && ret != EOF) {         cout << p.lNum << "\t" << p.sName << "\t" << p.llCard << "\t" << p.iMonth << "\t"         << p.dYFgz << "\t" << p.dShuiDian << "\t" << p.dShuiJin << "\t" << p.sGroup         << "\t" << p.dSFgz << "\t" << p.sPS<<endl;         ret = fscanf(fp,"%ld %s %lld %d %lf %lf %lf %s %lf %s\n",                 &p.lNum,p.sName,&p.llCard,&p.iMonth,&p.dYFgz,&p.dShuiDian,&p.dShuiJin,p.sGroup,&p.dSFgz,p.sPS);     }     fclose(fp); } int main() {     Add();     Operate();     return 0; }   供参考。 不用用,逗号，并且使用fscanf/fprintf来读取文件，如果用逗号，加以用fgets/strtok。因为逗号不能区分%s和后面的类型数据。

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    乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream！ 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。

user: user-0
content: 不好意思  运行结果是这张图片

user: user-0
content: 我将你修改的代码加入我的代码中实验发现字符串还是没法显示  之前我也用的是空格分隔 结果一直读不出来 我才改用的逗号分隔