C++读纯数据文件,输出全是0,请教。。。

mechanicser 2016-05-29 11:44:56
经过前面几位前辈的指点,我程序前半部分都OK了,可是后面这两个纯数据文件搞不懂怎么回事,我读写格式都一样,前面能输出,后面这两个却输出不了!
主要是BEAM_PROPERTY.txt与DATA.txt这两个文件读写有问题,貌似读不进去,读进去的都是0!

#include <iostream>
#include <fstream>
#include <cstdlib> //exit()
#include <iomanip>
#include <cmath>
#include <string>
#include <ctime>

using namespace std;

const int MAX_SEC = 5; //杆件断面分段数最大取5段
const int MAX_LOAD = 100; //最大荷载数目
const int MAX_BEAM = 10000; //最大杆件数目
struct BEAM_ELEMENT
{
int beam_no;
int j1,j2;
int beamtype_no;
string steel;
double beta;
double length;
}BE[MAX_BEAM];

struct Q_STEEL
{
int thick1,thick2;
double r_tense; //抗拉
double r_press; //抗压抗弯
double r_shear; //抗剪
double r_phole; //孔壁承压
};
struct DATA
{
double QY; //Y=Yield屈服
Q_STEEL QC[3];
}steel_data[3];

struct FORCE
{
double sec_dis; //断面距离(从杆件始端到末端)
double fx,fy,fz;
double mx,my,mz;
};
struct BEAM_FORCE
{
int load_number; //荷载编号
string load_name; //荷载名称
FORCE F[MAX_SEC];
};
struct BEAM_FORCE_FILE
{
int beam_number; //梁编号
BEAM_FORCE BF[MAX_LOAD];
}BFF[MAX_BEAM];

struct BEAM_PROPERTY
{
int beam_type_no;
int side;
int SD; //STRAT DIAMETER
int ED; //END DIAMETER
int THICKNESS;
int ST_TYPE; //STEEL TYPE
}BP[MAX_BEAM];

int COUNT_LINE_NUMBER(char * filename);

int main()
{
int i,j,k;
ifstream fin;

//读取BEAM_FORCE.TXT
fin.open("BEAM_FORCE.TXT");
if(!fin.is_open())
{
cout << "Fail to open BEAM_FORCE.TXT !" << endl;
cin.get();
exit(EXIT_FAILURE);
}
int beam_pcs; //梁单元数量
int load_pcs; //工况数量
int beam_sec; //每根杆件断面数
string ENTER; //吃掉换行符用
string NOTHING; //吃掉最上面中文用
fin >> beam_pcs;
fin >> load_pcs;
fin >> beam_sec;
getline(fin,ENTER);
getline(fin,NOTHING);

// BEAM_FORCE_FILE BFF[MAX_BEAM];
cout << beam_pcs << " " << load_pcs << " " << beam_sec << endl;
cout << "BEAM_FORCE has " << beam_pcs << " beams, " << load_pcs << " loads and every beam has ";
cout << beam_sec << " sections force." << endl;
cin.get();

for(i=0;i<beam_pcs;i++)
{
fin >> BFF[i].beam_number;
for(j=0;j<load_pcs;j++)
{
fin >> BFF[i].BF[j].load_number;
fin >> BFF[i].BF[j].load_name;
for(k=0;k<beam_sec;k++)
{
fin >> BFF[i].BF[j].F[k].sec_dis;
fin >> BFF[i].BF[j].F[k].fx;
fin >> BFF[i].BF[j].F[k].fy;
fin >> BFF[i].BF[j].F[k].fz;
fin >> BFF[i].BF[j].F[k].mx;
fin >> BFF[i].BF[j].F[k].my;
fin >> BFF[i].BF[j].F[k].mz;
}
}
}
fin.close();

ofstream fout;
fout.open("BEAM_FORCE_COMPARE.TXT");
fout << right << fixed;
for(i=0;i<beam_pcs;i++)
{
fout << setw(3) << BFF[i].beam_number;
for(j=0;j<load_pcs;j++)
{
fout << setw(6) << BFF[i].BF[j].load_number;
fout << setw(20)<< BFF[i].BF[j].load_name;
for(k=0;k<beam_sec;k++)
{
fout << setw(8) << setprecision(3) << BFF[i].BF[j].F[k].sec_dis;
fout << setw(8) << setprecision(3) << BFF[i].BF[j].F[k].fx;
fout << setw(8) << setprecision(3) << BFF[i].BF[j].F[k].fy;
fout << setw(8) << setprecision(3) << BFF[i].BF[j].F[k].fz;
fout << setw(8) << setprecision(3) << BFF[i].BF[j].F[k].mx;
fout << setw(8) << setprecision(3) << BFF[i].BF[j].F[k].my;
fout << setw(8) << setprecision(3) << BFF[i].BF[j].F[k].mz << endl;
fout << " ";
}
}
}
fout << endl;
fout.close();

//读取BEAM_ELEMENT.TXT
fin.open("BEAM_ELEMENT.TXT");
if(!fin.is_open())
{
cout << "Fail to open BEAM_ELEMENT.TXT !" << endl;
cin.get();
exit(EXIT_FAILURE);
}
char filename1[30] = "BEAM_ELEMENT.TXT";
int line_number1;
line_number1 = COUNT_LINE_NUMBER(filename1);
cout << "BEAM_ELEMENT.TXT has " << line_number1 << " lines(beams) of data!" << endl; //检查此文件行数是否正确,不正确把最后一行空格去掉
cin.get();
for(i=0;i<line_number1;i++)
{
fin >> BE[i].beam_no;
fin >> BE[i].j1;
fin >> BE[i].j2;
fin >> BE[i].beamtype_no;
fin >> BE[i].steel;
fin >> BE[i].beta;
fin >> BE[i].length;
}
fin.close();

fout.open("BEAM_ELEMENT_COMPARE.TXT");
for(i=0;i<line_number1;i++)
{
fout << setw(5) << BE[i].beam_no;
fout << setw(6) << BE[i].j1;
fout << setw(6) << BE[i].j2;
fout << setw(6) << BE[i].beamtype_no;
fout << setw(7) << BE[i].steel;
fout << setw(7) << setprecision(1) << BE[i].beta;
fout << setw(7) << setprecision(3) << BE[i].length;
fout << endl;
}
fout.close();

//读取BEAM_PROPERTY.TXT
fin.open("BEAM_PROPERTY.TXT");
if(!fin.is_open())
{
cout << "Fail to open BEAM_PROPERTY.TXT !" << endl;
cin.get();
exit(EXIT_FAILURE);
}
char filename2[30] = "BEAM_PROPERTY.TXT";
int line_number2;
line_number2 = COUNT_LINE_NUMBER(filename2);
cout << "BEAM_PROPERTY.TXT has " << line_number2 << " types of beam!" << endl; //检查此文件行数是否正确,不正确把最后一行空格去掉
cin.get();
for(i=0;i<line_number2;i++)
{
fin >> BP[i].beam_type_no;
fin >> BP[i].side;
fin >> BP[i].SD;
fin >> BP[i].ED;
fin >> BP[i].THICKNESS;
fin >> BP[i].ST_TYPE;
}
fin.close();

fout.open("BEAM_PROPERTY_COMPARE.TXT");
for(i=0;i<line_number2;i++)
{
fout << setw(5) << BP[i].beam_type_no;
fout << setw(6) << BP[i].side;
fout << setw(6) << BP[i].SD;
fout << setw(6) << BP[i].ED;
fout << setw(6) << BP[i].THICKNESS;
fout << setw(7) << BP[i].ST_TYPE;
fout << endl;
}
fout.close();

//读取DATA.TXT
fin.open("DATA.TXT");
if(!fin.is_open())
{
cout << "Fail to open DATA.TXT !" << endl;
cin.get();
exit(EXIT_FAILURE);
}
for(i=0;i<3;i++)
{
fin >> steel_data[i].QY;
for(j=0;j<3;j++)
{
fin >> steel_data[i].QC[j].thick1;
fin >> steel_data[i].QC[j].thick2;
fin >> steel_data[i].QC[j].r_tense;
fin >> steel_data[i].QC[j].r_press;
fin >> steel_data[i].QC[j].r_shear;
fin >> steel_data[i].QC[j].r_phole;
}
}
fin.close();

fout.open("DATA_COMPARE.TXT");
for(i=0;i<3;i++)
{
fout << setw(7) << steel_data[i].QY << endl;
for(j=0;j<3;j++)
{
fout << setw(7) << steel_data[i].QC[j].thick1;
fout << setw(7) << steel_data[i].QC[j].thick2;
fout << setw(7) << steel_data[i].QC[j].r_tense;
fout << setw(7) << steel_data[i].QC[j].r_press;
fout << setw(7) << steel_data[i].QC[j].r_shear;
fout << setw(7) << steel_data[i].QC[j].r_phole << endl;
}
}
fout.close();



return 0;
}

int COUNT_LINE_NUMBER(char * filename)
{
ifstream fin;
fin.open(filename);
int n=0;
string line_data;
if(!fin.is_open())
{
cout << "Fail to open " << filename << "." <<endl;
cin.get();
exit(EXIT_FAILURE);
}
while(getline(fin,line_data)) //while()括号中只要是非0就是真,如果读入的是0,那么就是假,while循环会结束
{
n++;
}
fin.close();
return n;
}


这是文件内容:




请教前辈!
...全文
1699 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-30
  • 打赏
  • 举报
回复
仅供参考:
//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

mechanicser 2016-05-30
  • 打赏
  • 举报
回复
求前辈们帮帮忙!
赵4老师 2016-05-30
  • 打赏
  • 举报
回复
乍看起来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。
赵4老师 2016-05-30
  • 打赏
  • 举报
回复
浪子回头金不换。 不撞南墙不回头, 不见棺材不落泪。
mechanicser 2016-05-30
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
[quote=引用 1 楼 zhao4zhong1 的回复:] 乍看起来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。
不听老人言,吃亏在眼前。[/quote] 听听听!~赵4老师~我先把手头上这个东西弄完就回头学习下!~而且遇到问题总归要想办法解决么~
赵4老师 2016-05-30
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
乍看起来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。
不听老人言,吃亏在眼前。
mechanicser 2016-05-30
  • 打赏
  • 举报
回复
经过锲而不舍的百度,我终于解决了这个问题。在每一个fin.close();前面加fin.clear();就可以正确读入了!我去!。。。请教大神,这是怎么回事?是不是计算机抽风还是。。。真的我程序有问题!为什么我以前写的一些程序结构体比这还多都没事,都可以正确读入。这次就出现这样的问题。
mechanicser 2016-05-30
  • 打赏
  • 举报
回复
我今天把我的代码又试验了下,发现了如下问题: 我把代码大部分都删除,只留下

//读取BEAM_PROPERTY.TXT
  fin.open("BEAM_PROPERTY.TXT");    
  if(!fin.is_open())
  {
    cout << "Fail to open BEAM_PROPERTY.TXT !" << endl;
    cin.get();
    exit(EXIT_FAILURE);
  }
  char filename2[30] = "BEAM_PROPERTY.TXT";
  int line_number2;
  line_number2 = COUNT_LINE_NUMBER(filename2);
  cout << "BEAM_PROPERTY.TXT has " << line_number2 << " types of beam!" << endl; //检查此文件行数是否正确,不正确把最后一行空格去掉 
  cin.get();
  for(i=0;i<line_number2;i++)
    {
    fin >> BP[i].beam_type_no;
    fin >> BP[i].side;
    fin >> BP[i].SD;
    fin >> BP[i].ED;
    fin >> BP[i].THICKNESS;
    fin >> BP[i].ST_TYPE;
    }
  fin.close();  
   
  fout.open("BEAM_PROPERTY_COMPARE.TXT");
  for(i=0;i<line_number2;i++)
    {
    fout << setw(5) << BP[i].beam_type_no;
    fout << setw(6) << BP[i].side;
    fout << setw(6) << BP[i].SD;
    fout << setw(6) << BP[i].ED;
    fout << setw(6) << BP[i].THICKNESS;
    fout << setw(7) << BP[i].ST_TYPE;
    fout << endl;
    }
  fout.close();  
   
//读取DATA.TXT
  fin.open("DATA.TXT");    
  if(!fin.is_open())
  {
    cout << "Fail to open DATA.TXT !" << endl;
    cin.get();
    exit(EXIT_FAILURE);
  }
  for(i=0;i<3;i++)
  {
    fin >> steel_data[i].QY;
    for(j=0;j<3;j++)
    {
     fin >> steel_data[i].QC[j].thick1;
     fin >> steel_data[i].QC[j].thick2;
     fin >> steel_data[i].QC[j].r_tense;
     fin >> steel_data[i].QC[j].r_press;
     fin >> steel_data[i].QC[j].r_shear;
     fin >> steel_data[i].QC[j].r_phole;
    }
  }
  fin.close();  
   
  fout.open("DATA_COMPARE.TXT");
  for(i=0;i<3;i++)
  {
    fout << setw(7) << steel_data[i].QY << endl;
    for(j=0;j<3;j++)
    {
     fout << setw(7) << steel_data[i].QC[j].thick1;
     fout << setw(7) << steel_data[i].QC[j].thick2;
     fout << setw(7) << steel_data[i].QC[j].r_tense;
     fout << setw(7) << steel_data[i].QC[j].r_press;
     fout << setw(7) << steel_data[i].QC[j].r_shear;
     fout << setw(7) << steel_data[i].QC[j].r_phole << endl;
    }
  }
  fout.close();    
只留下读取BEAM_PROPERTY与DATA文件这两块的代码。首先我只留下读取BEAM_PROPERTY文件的代码,发现可以读取,并在BEAM_PROPERTY_COMPARE文件中回显正确。然后删除,只留下读取DATA的代码块,编译通过,发现DATA_COMPARE文件里也写入正确。 然后我把这两部分代码放在一起,把BEAM_PROPERTY放在前面,DATA放在后面,发现BEAM_PROPERTY可以读取并回显正确,而DATA则全是0。然后调换下,把DATA放前面,BEAM_PROPERTY放后面,发现DATA正确,BEAM_PROPERTY却全是0!这编译器到底抽什么风的!这是什么意思啊!DEV C++ 4.9.9.2 请前辈们指教!
C语言课程设计是一个旨在帮助学生深入理解和应用C语言编程的实践项目。以下是一些关于C语言课程设计的基本步骤和建议: 明确目标和需求:首先,你需要与授课教师或课程设计的相关人员沟通,明确课程设计的需求。这包括了解课程设计的主题、目标以及需要解决的问题。这将有助于你确定设计的范围和方向。 选择项目主题:选择一个与C语言相关的项目主题。例如,你可以设计一个学生成绩管理系统、一个简单的文本编辑器或一个游戏等。确保所选主题既具有挑战性又能够展示你的C语言编程技能。 进行问题分析:一旦确定了项目主题,你需要对问题进行深入分析。这包括确定问题的输入和输出、理解问题的要求和限制条件,以及将复杂问题分解为更小的子问题。这将有助于你更好地理解和解决问题。 设计算法和数据结构:针对项目需求,设计合适的算法和数据结构。这包括确定如何存储和处理数据、如何设计函数和模块等。 编写代码:使用C语言编写代码,实现项目功能。注意遵守C语言的语法规则,确保代码的可读性和可维护性。 测试和调试:在编写完代码后,进行测试和调试。确保代码能够正确运行并满足项目需求。使用调试工具和技术来查找和修复代码中的错误。 文档编写:编写项目文档,包括项目说明、功能介绍、代码注释等。这将有助于其他人理解你的项目并复用你的代码。 提交和展示:最后,将你的课程设计项目提交给教师或相关人员,并在课堂上进行展示。展示时可以介绍项目的功能、实现过程以及遇到的挑战和解决方案等。 在进行C语言课程设计时,还需要注意以下几点: 遵守编程规范,包括变量命名、代码缩进、注释等。 充分利用C语言的特点和优势,如指针、结构体、文件操作等。 注重实践和应用,通过解决实际问题来加深对C语言的理解和应用能力。 在遇到困难时,及时向教师或同学请教,并查阅相关资料和文档。 通过以上步骤和建议,你可以完成一个高质量的C语言课程设计项目,并提升自己的编程能力和实践经验。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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