C++ 从文件中读取未给出预期的或任何输出
C++ reading from file is not giving expected, or any output
我正在尝试制作一款从文本文件加载关卡的游戏。我决定借助一个二维整数向量来完成这项工作。在我的主要代码中实现它之前,我首先决定检查我的逻辑是否正确,所以我制作了一个 Test.txt 文件,其中包含我想要绘制的级别。
Test.txt:-
1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0
1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0
0 0 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0
1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1
0 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 1
0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1
0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0
0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1
0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0
0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1
0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 0
1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 0
1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1
0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0
0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0
1 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 1
每个整数由 space 分隔,一次只能读取一个数字。 1 和 0 告诉游戏要绘制哪个图块。现在,用 c++ 编写以下代码来读取文件并用它的内容填充向量。之后它应该输出向量的内容。
Test.cpp:-
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int num;
vector<vector<int>> nums;
int main(void) {
ifstream FileIn;
FileIn.open("Test.txt");
for(int i = 0; i < 18; i++) {
vector<int> temp;
for(int j = 0; j < 32; j++) {
FileIn >> num;
temp.push_back(num);
}
nums.push_back(temp);
temp.clear();
}
cout << nums.size() << '\n'; // outputs 18
for (unsigned int i=0; i < nums.size(); i++) {
for (unsigned int j=0; j < nums[i].size(); j++) {
cout << nums[i][j];
if (j == nums[i].size() - 1) cout << '\n';
}
}
FileIn.close();
return 0;
}
但这就是问题开始的地方。该代码不会向终端输出任何内容,它只是启动然后返回到提示符。
可执行文件编译没有错误,也没有崩溃或运行时错误。就是没有输出。
我尝试过的事情:
- 在数字之间输入 spaces
- 将所有整数保持在同一行
- 以上两种解决方案,但这次一起使用
我在具有 amd-64 架构的英特尔 windows 10(64 位)上使用带有 platformio 终端插件的 atom。任何帮助将不胜感激。
一些事情:开始学习如何使用调试器。如果您使用调试器单步执行代码,您对 Whosebug 的问题可能很容易自己回答。这会为您和我们节省时间。
已编辑:
此外,您在未验证或设置“当前工作目录”的情况下打开 'test.txt'。这只有在您从相同路径启动应用程序时才有效,test.txt 在其中。但是如果您从其他地方 运行 应用程序,工作目录可能不同。
您没有检查 eof
或任何其他错误情况。你怎么知道打开文件是否真的有效?还是读号?或者你所期望的数字数量。
检查错误条件可能看起来很麻烦,但绝对不是。寻找你没有检查代码的错误,比养成检查错误的习惯更耗时。
这是一些代码:
ifstream FileIn;
FileIn.open("test.txt");
if (!FileIn.good())
cerr << "Could not open file...";
else {
while (!FileIn.eof()) {
int num; ///!!! DONT make `num` a global variable
FileIn >> num;
if (FileIn.bad()) {
cerr << "Invalid number in file...";
return 1; // return prematurely from the application
}
// Do something with the number
}
}
此外,使用 cout << endl
而不是 cout << '\n';
。 endl
是插入换行符的官方方式,它适用于任何平台,而 '\n' 可能有效也可能无效。某些平台需要两个字符。
所以我终于找到了问题所在,代码、逻辑、文本文件一切正常。在从其他答案中获取有关调试器的建议后,这次我没有使用 atom 的终端插件,而是使用了 powershell 并且它起作用了。它给出了我期待的输出。然后我用原子的终端尝试了相同的代码,但没有给出任何输出。所以问题似乎不在代码中,而是在我使用的终端中。
我正在尝试制作一款从文本文件加载关卡的游戏。我决定借助一个二维整数向量来完成这项工作。在我的主要代码中实现它之前,我首先决定检查我的逻辑是否正确,所以我制作了一个 Test.txt 文件,其中包含我想要绘制的级别。
Test.txt:-
1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0
1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0
0 0 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0
1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1
0 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 1
0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1
0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0
0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1
0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1
1 1 0 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0
0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1
0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 0
1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 0
1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1
0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0
0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0
1 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 1
每个整数由 space 分隔,一次只能读取一个数字。 1 和 0 告诉游戏要绘制哪个图块。现在,用 c++ 编写以下代码来读取文件并用它的内容填充向量。之后它应该输出向量的内容。
Test.cpp:-
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int num;
vector<vector<int>> nums;
int main(void) {
ifstream FileIn;
FileIn.open("Test.txt");
for(int i = 0; i < 18; i++) {
vector<int> temp;
for(int j = 0; j < 32; j++) {
FileIn >> num;
temp.push_back(num);
}
nums.push_back(temp);
temp.clear();
}
cout << nums.size() << '\n'; // outputs 18
for (unsigned int i=0; i < nums.size(); i++) {
for (unsigned int j=0; j < nums[i].size(); j++) {
cout << nums[i][j];
if (j == nums[i].size() - 1) cout << '\n';
}
}
FileIn.close();
return 0;
}
但这就是问题开始的地方。该代码不会向终端输出任何内容,它只是启动然后返回到提示符。
可执行文件编译没有错误,也没有崩溃或运行时错误。就是没有输出。
我尝试过的事情:
- 在数字之间输入 spaces
- 将所有整数保持在同一行
- 以上两种解决方案,但这次一起使用
我在具有 amd-64 架构的英特尔 windows 10(64 位)上使用带有 platformio 终端插件的 atom。任何帮助将不胜感激。
一些事情:开始学习如何使用调试器。如果您使用调试器单步执行代码,您对 Whosebug 的问题可能很容易自己回答。这会为您和我们节省时间。
已编辑:
此外,您在未验证或设置“当前工作目录”的情况下打开 'test.txt'。这只有在您从相同路径启动应用程序时才有效,test.txt 在其中。但是如果您从其他地方 运行 应用程序,工作目录可能不同。
您没有检查 eof
或任何其他错误情况。你怎么知道打开文件是否真的有效?还是读号?或者你所期望的数字数量。
检查错误条件可能看起来很麻烦,但绝对不是。寻找你没有检查代码的错误,比养成检查错误的习惯更耗时。
这是一些代码:
ifstream FileIn;
FileIn.open("test.txt");
if (!FileIn.good())
cerr << "Could not open file...";
else {
while (!FileIn.eof()) {
int num; ///!!! DONT make `num` a global variable
FileIn >> num;
if (FileIn.bad()) {
cerr << "Invalid number in file...";
return 1; // return prematurely from the application
}
// Do something with the number
}
}
此外,使用 cout << endl
而不是 cout << '\n';
。 endl
是插入换行符的官方方式,它适用于任何平台,而 '\n' 可能有效也可能无效。某些平台需要两个字符。
所以我终于找到了问题所在,代码、逻辑、文本文件一切正常。在从其他答案中获取有关调试器的建议后,这次我没有使用 atom 的终端插件,而是使用了 powershell 并且它起作用了。它给出了我期待的输出。然后我用原子的终端尝试了相同的代码,但没有给出任何输出。所以问题似乎不在代码中,而是在我使用的终端中。