这太愚蠢了.我一直被困在一个小时内试图读取一个由单个空格分隔的.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);
}
Run Code Online (Sandbox Code Playgroud)
嗯,更仔细地看一下这条线:
while (myfile >> num);
Run Code Online (Sandbox Code Playgroud)
最终,你会注意到分号.编译器认为这意味着你想要一个什么都不做的循环(这里的分号表示一个空的语句).因此,循环读取所有数字,但对它们不做任何操作.
下一节被单独解释为在其自己的范围内的语句(由大括号表示),在循环之后执行:
{
x.push(num);
}
Run Code Online (Sandbox Code Playgroud)
所有这一切都是将最后一个数字读入堆栈,导致您认为循环只执行一次.
删除;你,你没事!一旦被这个咬了,你永远不会忘记;-)
在一个不相关的注释中,采用argv[1](一个C风格的字符串),将它放入一个string对象,然后用它将其转换c_str()为ifstream构造函数的C字符串是有点愚蠢的.只是argv[1]直接使用,因为你没有做任何其他事情.此外,最好首先检查argc并确保传入文件名.最后,您应该检查文件是否已成功打开而不是假设 - 至少使您的假设明确assert(myfile.is_open());.哦,你根本不使用line变量.