65,186
社区成员




#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;
}
//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
//读取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
请前辈们指教!