我对c ++很新,我花了大约六个小时就完成了这件事,遗憾的是没有结果。
我试图做以下事情。 (对我自己的做法)我有一个庞大的代码,我觉得发布会很愚蠢(浪费时间),所以我只发布一个更简单的版本。
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string.h>
using namespace std;
struct man{
char name[20];
int age;
};
struct group{
man* men[3];
};
void fill( man &y);
void show( man &y);
void input(group &x, man &y);
void output(group &x, man &y);
int main(){
man q;
group w;
input(w, q);
cout<<endl;
output(w, q);
ofstream w1file("B.dat");
for (int i=0; i<2; i++){
w1file.write((char*) &w.men[i]->name, 20);
w1file.write((char*) &w.men[i]->age, sizeof(int));
}
w1file.close();
ifstream r1file("B.dat");
while(r1file.good()){
r1file.read((char*) &w.men[0]->name, 20);
r1file.read((char*) &w.men[0]->age, sizeof(int));
r1file.read((char*) &w.men[1]->name, 20);
r1file.read((char*) &w.men[1]->age, sizeof(int));
}
output(w, q);
r1file.close();
system("pause");
return 0;
}
void fill( man &y){
gets(y.name);
cin>>y.age;
cin.ignore();
}
void show( man &y){
cout<<y.name<<endl;
cout<<y.age<<endl;
}
void input(group &x, man &y){
x.men[2]= new man[2];
for (int i=0; i<2;i++){
fill(y);;
x.men[i]= new man(y);
}
}
void output(group &x, man &y){
for (int i=0; i<2;i++){
show(*x.men[i]);
}
}
如果我删除了写入部分,那么只要我按下运行程序就会崩溃。 香港专业教育学院尝试过这样,并使用文件&gt;&gt;&#34;变量&#34; ...我只尝试了第一个元素...尝试将整个事物复制到一个数组,写入数组然后读取它,但没有任何作用:(
我还希望它输出文件中的数据,如下所示:(示例)
#in the txt, dat, whatever
John 21
Pier 18...etc
所以我可以直接从书面文件中编辑数据。 但是我得到的是:
John н@ А…J { Adam ed н@ А…J Х
我最初的想法是创建一个程序,以表格的形式将数据输出到文件(希望你理解我) exmpl。
name1 age1 wage1 married/not married1
name2 age2 wage2 married/not married2
name3...age3...etc
来自天堂的人可以帮助我,如果可能的话,解释我做错了什么?
答案 0 :(得分:0)
for (int i; i<2; i++){
查看此行,直到看到问题为止。一直看着它,直到你这样做。
提示:在此循环中,您期望i
的第一个值是什么?
P.S。:为什么你为男性[0]和男性[1]分配man
的单个实例,为男性分配man
的两个实例[2]?
答案 1 :(得分:0)
有几个问题:
写作使用未初始化的变量i,因此它以未确定的值开始。试试:
for (int i=0; i<2; i++){ //i=0 !!
然后在默认文本模式下打开的文件中写入二进制数据。这可以根据二进制值和操作系统改变文件中有效写入的内容。所以:
ofstream w1file("B.dat", ios::binary); // binary mode instead of text mode
同样适用于阅读流。
请注意,您可以在该组中拥有0到3名男性。在小组的开头写一些项目是明智的。因此,在阅读小组时,您可以先读取预期的项目数,然后循环播放,直到您全部阅读完为止。你当前的阅读循环很奇怪,因为它会读取文件并不断覆盖2个第一个男人(如果文件中有更多数据)。
您可以正确阅读的方式是:
const int maxmen=3;
for (int i=0; i<maxmen && r1file.read((char*) &w.men[i]->name, 20)
&& r1file.read((char*) &w.men[0]->age, sizeof(int)); i++)
cout << "Successfuly read item "<<i<<endl;
}
另请注意,此代码严重泄漏内存。