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;
}

但这就是问题开始的地方。该代码不会向终端输出任何内容,它只是启动然后返回到提示符。

可执行文件编译没有错误,也没有崩溃或运行时错误。就是没有输出。

我尝试过的事情:

我在具有 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 并且它起作用了。它给出了我期待的输出。然后我用原子的终端尝试了相同的代码,但没有给出任何输出。所以问题似乎不在代码中,而是在我使用的终端中。