所以我有一个类对象类型,myClass classType作为全局。 没有发生的事情是更愿意拥有
// MyClass.h
{
private:
char FirstName;
char LastName;
char MiddleName;
int ID;
int Age;
};
// Globals
const int myIndex = 256;
myClass classType[ myIndex ];
int main()
{
// assume preprocessors are included
cout << "Enter File: ";
cin >> cArray;
if ( !inFile.good() )
{
cout << "Wrong?" << endl;
}
inFile.open( cArray );
while ( !inFile.eof() )
{
linecount++ // giving me 1 and not counting the file lines
inFile.read( ( char * ) &myType[linecount], sizeof( myClass ) );
}
}
这是一个粗略的想法,今天的主要外观。 我还没有使用myClass.cpp! 我的文本文件格式为:
姓 姓 身份证号码 年龄 ...
调试之后,我注意到在同一个索引上没有检测到换行符,现在所有内容都被BUNCHED了!就像我的增量没有工作或其他东西..
我想增加它们在文件中的许多行。 ( 超过一个 ) 我试图修复linecount(idx),希望能完全解决这个问题。
调试和拖动myclasstype时,我上面写的My Private成员,FirstName LastName等等存在。 我只需要用适当的变量来获取它们。 我只是希望ifstream :: read()函数不会让我走向糟糕的方向。
任何建议?
答案 0 :(得分:1)
// MyClass.h
{
private:
char FirstName;
char LastName;
char MiddleName;
int ID;
int Age;
};
这个结构/类是什么?我想这是myClass。无论如何,myClass并不是有意义的名字。
``
// Globals
const int myIndex = 256;
myClass classType[ myIndex ];
根据经验 - 从不使用全局变量。你会有问题。
int main()
{
// assume preprocessors are included
cout << "Enter File: ";
cin >> cArray;
什么是cArray?
if ( !inFile.good() )
inFile定义在哪里?为什么在此流上的任何IO操作之前检查IO状态?
{
cout << "Wrong?" << endl;
}
inFile.open( cArray );
好。写ifstream inFile(cArray)
不是更简单吗?
while(!inFile.eof()) { linecount ++ //给我1而不计算文件行
你要求溢出。如果文件有256行以上怎么办?什么最糟糕的程序不会崩溃 - 它可能写在一些不明确的地方。
inFile.read( ( char * ) &myType[linecount], sizeof( myClass ) );
如果 使用二进制格式,则不以这种方式阅读。实际上,您无法确定编译器是否未更改偏移量。例如,ID
通常会有4个字节的偏移量。但是编译器可以自由地优化它。
另外,您无法确定ID
和Age
的大小,除非它们大于2个字节。它们通常是4,但在一些64位编译器上(恕我直言,这样的方式是正确的int
==单个单词)thay可能是8.将来可能是16(如果有128位计算机)。你可能认为从来没有,但以同样的方式“为所有人提供了768 K”(那时候很多)。
如果您尝试以这种方式阅读文本
}
}
除非您需要验证输入(在这种情况下,iostreams不是最好的工具):
class person
{
public:
person (const std::string &first_name,
const std::string &last_name,
const std::string &middle_name,
int id,
int age)
: m_first_name(first_name),
m_last_name(last_name),
m_middle_name(middle_name,
m_id(id),
m_age(age) {}
private:
std::string m_first_name, m_last_name, m_middle_name;
int m_id, m_age;
};
// Lots of other code
std::vector<person> people;
while(...)
{
std::string first_name, last_name, middle_name;
int id, age;
in_file >> first_name >> last_name >> middle_name >> id >> age;
person p(first_name, last_name, middle_name, id, age);
people.push_back(p);
}
它可以缩短并且必须填充但是: 1.使用漂亮的C ++功能,例如STL(你不必记住索引,或者你不必担心矢量溢出) 2.它使用文本格式
答案 1 :(得分:0)
答案 2 :(得分:0)
几点;
答案 3 :(得分:0)
如果您的数据来自文本文件,那么read(buf,size)的方法将无效。 它将使用从输入读取的任何字节填充buf。 你不能以这种方式在内存中的某个地方“填充”对象。 read(buf,size)仅适用于二进制数据。
我会重载流运算符&gt;&gt;做textdata的实际解析。 输出将存储在作为引用传递的对象中:
istream& operator>> (istream& in, MyClass& val );