使用C++从.txt文件中读取整数并将其存储到堆栈中

3

这真是太愚蠢了。我已经被卡住了一个小时,试图读取一个以单个空格分隔的数字的 .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

嗯,仔细看看这行:

while (myfile >> num);

最终,你会注意到分号。编译器认为这意味着你想要一个什么也不做的循环(这里的分号表示单个空语句)。因此,循环读取所有数字,但不对它们进行任何操作。
下一节被单独解释为其自己作用域中的语句(由大括号表示),在循环之后执行:
{
    x.push(num);
}

所有这个做的就是将最后一个读取的数字推入堆栈,让你认为循环只执行一次。
去掉分号就行了!一旦被这个坑过,你就不会忘记了 ;-)
不相关的是,将argv[1](C风格字符串)放入string对象中,然后使用c_str()将其转换回用于ifstream构造函数的C字符串有点傻。直接使用argv[1],因为你没有对它做任何其他事情。另外,先检查argc并确保传递了文件名是一个好主意。最后,你应该检查文件是否成功打开,而不是假设它--至少要显式地使用assert(myfile.is_open())来表明你的假设。哦,而且你根本没有使用line变量。

2
也许现在你会明白为什么人们坚持要求你始终启用所有编译器警告了... - Kerrek SB
@Cameron 在什么情况下文件无法正确打开?是随机的操作系统错误吗? - CyberShot
2
@CyberShot:使用更多的警告:-W -Wall -Wextra -pedantic - Kerrek SB
@CyberShot:好问题。总是有很多错误情况,特别是在IO方面。也许指定的文件名不存在(因为打错字或者工作目录不对)。或者程序没有适当的权限来打开文件。或者文件在SAN上,网络在错误的时刻失败了。或者文件系统(部分)损坏了。或者在指定文件和尝试打开它之间的时间内删除了该文件。正如你所说,总会有随机的操作系统错误 :-) - Cameron
@CyberShot:没问题,但我绝不是专家。错误检查只是良好编程实践中的一部分(因为错误是不可避免的)。有时,甚至建议在应该始终正常的东西上添加“健全性检查” (见倒数第二段)以防万一——显然,在玩具应用程序中,这种级别的错误检测不太重要,在航天飞机软件中更为重要。健壮性(以及可读性,可维护性等)是开发的重要组成部分,并且并不总是得到足够的关注。 - Cameron
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接