C++ c++;从.txt文件读取整数到堆栈

C++ c++;从.txt文件读取整数到堆栈,c++,ifstream,C++,Ifstream,这太愚蠢了。我已经被困了一个小时试图读入一个由单个空格分隔的.txt数字文件。由于某些原因,while循环只执行一次 #include <iostream> #include <string> #include <fstream> #include <stack> using namespace std; int main(int argc, char* argv[]) { string line; string str(arg

这太愚蠢了。我已经被困了一个小时试图读入一个由单个空格分隔的.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);
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
弦线;
字符串str(argv[1]);
ifstream myfile((str.c_str());
int-num;
堆栈x;
while(myfile>>num);
{
x、 推送(num);
}
返回(0);
}

嗯,仔细看这一行:

while (myfile >> num);
最后,您会注意到分号。编译器认为这意味着您需要一个不做任何事情的循环(这里的分号表示一条空语句)。因此,循环读取所有数字,但对它们不做任何处理

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

{
    x.push(num);
}
所做的只是将读取的最后一个数字推送到堆栈上,使您认为循环只执行一次

删除
你就没事了!一旦被它咬了,你永远不会忘记;-)


另一方面,将
argv[1]
(一个C样式的字符串)放入
string
对象中,然后使用
C_str()
将其转换回ifstream构造函数的C字符串有点傻。直接使用
argv[1]
,因为您没有用它做任何其他事情。另外,最好先检查
argc
,并确保传入了文件名。最后,您应该检查文件是否已成功打开,而不是假设它已成功打开——至少使用
assert(myfile.is_open())明确您的假设。哦,你根本不用
变量。

也许现在你会明白为什么人们坚持要你启用所有编译器警告,总是…@CyberShot:没问题;-)我在回答中添加了一段,挑剔了你的其余代码,仅供参考。@KerrekSB我使用了-Wall标志,没有收到任何警告。@Cameron在什么情况下文件不能正确打开?随机操作系统错误?@CyberShot:使用更多警告:
-W-Wall-Wextra-pedantic