我有一个程序,它应该从文件中读取有关项目的信息。问题是,我在不同的文件中传播了一些名为" G ***。DTA" (其中*** =某类物品的唯一编号,即" G34.DTA")。
为了从这些文件中读取,我创建了一个使用for循环浏览所有类别编号的函数。 for-loop的迭代变量用于创建我创建的ifstream对象的文件名(第一轮G1.DTA,第二轮G2.DTA等)。此外,并非每个类别都有一个文件,因此会有一些文件"缺少"。所以我的程序可以只有G2.DTA,G5.DTA,G10.DTA等。所有其他程序都应该被跳过。
无论如何,当我尝试从文件中读取时,我的程序就会挂起。任何人都可以看到我的错误在哪里,如果我包含从文件函数,构造函数和文件格式的读取?
此功能应从文件中读取:
void Items::readItemsFromFile() {
for(int i = 1; i <= categoryBase->lastCategoryInUse; i++) {
char filename[STRLEN];
char buffer[10];
int nr;
itoa(i, buffer, 10); // Makes category number a char for strcat()
strcpy(filename, "G"); // Makes "G" first part of filename
strcat(filename, buffer); // Makes category number (i) second part of filename
strcat(filename, ".DTA"); // Makes ".DTA" suffix of filename
ifstream infile(filename);
if(infile) {
infile >> nr;
while(!infile.eof()) {
itemList->add(new Item(nr, infile));
infile >> nr;
}
}
}
}
这里是构造函数(int n被发送到父类NumElement并设置为项目编号):
Item::Item(int n, ifstream & in): NumElement(n) {
char buffer[STRLEN];
in.getline(buffer, STRLEN);
salesman = new char[strlen(buffer) + 1]; strcpy(salesman, buffer);
in.getline(buffer, STRLEN);
title = new char[strlen(buffer) + 1]; strcpy(title, buffer);
in.getline(buffer, STRLEN);
description = new char[strlen(buffer) + 1]; strcpy(description, buffer);
in >> startTime >> endTime >> startPrice >> shipping >> increaseBid >> lastBid >> bidTime; in.ignore();
}
以下是文件格式的外观:
1
van gogh
summer
beautiful painting
1 2 100 33 5 0 0
3
da vinci
mona lisa
classic
2 3 50 20 3 0 0
答案 0 :(得分:0)
你调用std :: ifstream :: ignore(默认忽略eof)的任何机会都会使你的流忽略上次执行Item构造函数时的eof(从文件读取的最后一项)?
答案 1 :(得分:0)
读取带infile >> nr;
的整数后,读数将停在新行字符(根据您的文件结构),因此在开始使用getline()
从文件中读取行之前你应该致电ifstream::ignore()
。否则ifstream::getline()
将不会读取导致流设置为失败状态的任何字符,并且任何进一步的读取操作都将无法成功(因此您将无法到达文件结尾在无限循环迭代中)。
Item::Item(int n, ifstream & in): NumElement(n)
{
char buffer[STRLEN];
in.ignore(INT_MAX,'\n');//this should be here(ignores every thing up to and including the next newline character)
in.getline(buffer, STRLEN);
salesman = new char[strlen(buffer) + 1]; strcpy(salesman, buffer);
....
}
BTW你应该使用std :: string。另请参阅问题的评论部分,以获取有助于您改进代码的其他说明。