c ++ Чтение целых чисел из файла .txt в стек - PullRequest
3 голосов
/ 23 января 2012

Это так глупо.Я застрял буквально на час, пытаясь прочитать в текстовом файле .txt числа, разделенные одним пробелом.По какой-то причине циклы while выполняются только один раз!

#include <iostream>
#include <string>
#include <fstream>
#include <stack>

using namespace std;

int main(int argc, char* argv[])
{
    string line;
    string str(argv[1]);
    ifstream myfile((str).c_str());
    int num;
    stack<int> x;

    while (myfile >> num);
    {
        x.push(num);
    }

    return(0);
}

1 Ответ

7 голосов
/ 23 января 2012

Хм, посмотри на эту строчку повнимательнее:

while (myfile >> num);

В конце концов, вы заметите точку с запятой. Компилятор считает, что это означает, что вы хотите цикл, который ничего не делает (точка с запятой здесь указывает на одно пустое выражение). Итак, цикл читает все числа, но ничего с ними не делает.

Следующий раздел интерпретируется отдельно как оператор в своей собственной области (обозначается фигурными скобками), который должен выполняться после цикла:

{
    x.push(num);
}

Все, что нужно, это поместить последнее прочитанное число в стек, что заставляет вас думать, что цикл выполняется только один раз.

Удалите ; и все в порядке! Укушенный этим, вы никогда не забудете; -)

На несвязанной ноте немного глупо брать argv[1] (строку в стиле C), помещать его в объект string, а затем использовать c_str(), чтобы превратить его обратно в C-строку для Конструктор ifstream. Просто используйте argv[1] напрямую, так как вы больше ничего не делаете с ним. Кроме того, было бы неплохо сначала проверить argc и убедиться, что передано имя файла. Наконец, вы должны проверить, что файл был успешно открыт, а не предполагать его - по крайней мере, сделайте ваше предположение явным с assert(myfile.is_open());. О, и вы вообще не используете переменную line.

...