【问题标题】:c++ Reading in integers from a .txt file to a stackc ++将整数从.txt文件读入堆栈
【发布时间】:2012-01-23 03:49:06
【问题描述】:

这太愚蠢了。我已经被困了一个小时,试图读取一个由单个空格分隔的数字的 .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);
}

【问题讨论】:

    标签: c++ ifstream


    【解决方案1】:

    嗯,仔细看看这条线:

    while (myfile >> num);
    

    最终,您会注意到分号。编译器认为这意味着您需要一个不执行任何操作的循环(这里的分号表示单个空语句)。因此,循环读取所有数字,但对它们不做任何事情。

    下一部分被单独解释为在其自身范围内的语句(用大括号表示),在循环之后执行:

    {
        x.push(num);
    }
    

    所做的只是将最后读取的数字压入堆栈,导致您认为循环只执行一次。

    删除; 就可以了!一旦被这个咬住,你永远不会忘记;-)

    在不相关的注释中,将argv[1](C 风格的字符串)放入 string 对象,然后使用 c_str() 将其转回 C 字符串,这有点愚蠢。 ifstream 构造函数。只需直接使用argv[1],因为你没有用它做任何其他事情。此外,最好先检查argc 并确保传入了文件名。最后,您应该检查文件是否已成功打开而不是假设它 - 至少使您的假设明确一个assert(myfile.is_open());。哦,你根本不使用line 变量。

    【讨论】:

    • 也许现在您会明白为什么人们坚持要您始终启用所有编译器警告...
    • @Cyber​​Shot:没问题 ;-) 我已经在我的答案中添加了一个段落来挑剔你的其余代码,仅供参考。
    • @KerrekSB 我使用了 -Wall 标志并且没有收到任何警告。
    • @Cameron 在什么情况下文件不能正确打开?随机操作系统错误?
    • @Cyber​​Shot:使用更多警告:-W -Wall -Wextra -pedantic
    猜你喜欢
    • 2021-02-06
    • 2017-08-23
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多