c的文件操作

' 你的胰脏好吃吗? 2019-06-03 09:09:02
本人刚刚学完c 老师要求做一个小的管理系统 我在读文件的时候卡住了 经检验实在读字符串的时候出问题了
求大佬帮忙解答一下
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
char sID[20] = "zhb_gcsj_data1.txt";
typedef struct GongZi
{
long int lNum ;//工号
string sName;//姓名
long long int llCard;//银行卡号
int iMonth;//发工资的月份
double dYFgz;//应发工资
double dShuiDian;//水电费
double dShuiJin;//税金
string sGroup;//部门
double dSFgz;//实发工资
string sPS;//备注
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%*c",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%*c",p[i].sGroup);
p[i].dSFgz = p[i].dYFgz - p[i].dShuiDian - p[i].dShuiJin;
cout << "请输入有关该员工的备注:";
scanf("%s%*c",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;
employee p;
FILE *fp;
if((fp=fopen(sID,"r+"))==NULL){
cout << "error!" << endl;
exit(1);
}
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);
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;
fclose(fp);
}
int main()
{
Add();
Operate();
return 0;
}
...全文
121 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 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和后面的类型数据。
我将你修改的代码加入我的代码中实验发现字符串还是没法显示 但是只是用你提供这个却又可以读入字符串  之前我也用的是空格分隔 结果一直读不出来 我才改用的逗号分隔
自信男孩 2019-06-04
  • 打赏
  • 举报
回复
#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和后面的类型数据。
赵4老师 2019-06-04
  • 打赏
  • 举报
回复
仅供参考:
//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。
  • 打赏
  • 举报
回复
不好意思 运行结果是这张图片
  • 打赏
  • 举报
回复
我将你修改的代码加入我的代码中实验发现字符串还是没法显示 之前我也用的是空格分隔 结果一直读不出来 我才改用的逗号分隔

69,371

社区成员

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

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