C ++从同一函数中的各种文本文件中读取

时间:2016-04-16 13:07:01

标签: c++ file input

我有一个程序,它应该从文件中读取有关项目的信息。问题是,我在不同的文件中传播了一些名为" 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

2 个答案:

答案 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。另请参阅问题的评论部分,以获取有助于您改进代码的其他说明。