【问题标题】:Getting input from external files?从外部文件获取输入?
【发布时间】:2012-01-07 22:36:58
【问题描述】:

我需要从 C++ 中的外部文件获取非常基本的输入。我尝试在互联网上搜索了几次,但没有真正适用于我需要的东西。这将是一个输入来自的 .txt 文件,它会被这样的行填充:

131
241
371
481

我已经有代码可以手动获取这个输入,它看起来像这样:

using namespace std;
//Gets the initial values from the user.
    int control=0;
    while (rowb!=0){
        cout << "Row: ";
        cin >> rowb;
        cout << "Column: ";
        cin >> columnb;
        cout << "Number: ";
        cin >> numb;
        row[control]=rowb-1;
        column[control]=columnb-1;
        num[control]=numb;
        control++;
    }

这是解决 sudoko 板程序的一部分。输入的数字是sudoko板保存的初始值,用户输入的是来自板的行、列和数字。
我需要的是能够创建一个将这些数字存储在行中的 .txt 文件,这样我就不必输入这么多数字。我几乎不知道如何去做。主要是我只会使用 txt 文件来测试我的程序,因为我会向它添加更多代码。在我的程序中需要输入 150 多个数字才能获得一个板,而且需要很多时间。任何意外错误输入的值也是一个大问题,因为我必须重新开始。那么如何让 C++ 读取文本文件并使用这些数字作为输入呢?

【问题讨论】:

    标签: c++ file input external


    【解决方案1】:

    除了其他建议之外,您可以简单地将文件重定向到标准输入,如下所示($ 是命令提示符):

    $ myprogram < mytextfile.txt
    

    这将像往常一样运行myprogram,但从mytextfile.txt 获取输入,就好像你已经输入了一样。根本不需要调整你自己的程序。

    (这适用于 Unix/Linux 系统和 Windows。)

    【讨论】:

    • 好的。问题是我在 Mac 上使用 Xcode,所以我实际上并没有使用命令提示符来编译我的代码。只有一个按钮可以为我编译和运行它。有什么方法可以在程序中实现它吗?
    • @Redmastif:我给了这个答案+1,因为它是一个不错的选择。学习从命令行编译或至少运行程序可能对您很有用。这开辟了一系列全新的工具。
    • @Redmastif:是的,如果您不想从命令行运行,其他答案是正确的方法。
    【解决方案2】:

    您可以从标头&lt;fstream&gt; 中使用std::ifstream 打开一个文件进行输入,然后像从std::cin 中一样读取它。

    int main()
    {
        std::ifstream input("somefile.txt");
        int a;
        input >> a;  // reads a number from somefile.txt
    }
    

    显然,您可以在循环中使用&gt;&gt; 来读取多个数字。

    【讨论】:

    • @Redmastif:如果数字单独在一行上,这将一次读取一行。是的,您可以删除 std:: 部分。我养成了把它写出来的习惯,这样我就知道我的标识符来自哪里(标准库、其他库、当前程序)。
    • 感谢您的回答对我解决问题有很大帮助。
    【解决方案3】:

    创建一个std::ifstream 对象,并像从std::cin 中一样读取它。至少如果我理解你想要做什么,131 作为第一个输入实际上是三个单独的数字(131)。如果是这样,最简单的方法可能是稍微更改您的输入文件以在每个文件之间放置一个空格:

    1 3 1
    2 4 1
    3 7 1
    4 8 1
    

    【讨论】:

      【解决方案4】:

      就个人而言,我会从文件的不同格式开始:为每个单元格输入一个值。也就是说,输入文件中的每一行将代表 sudoko 板中的一行。空字段将使用空格字符。直接的优势是输入实际上看起来很像 sudoko 板。此外,您最多可以输入 90 个字符:白板 9 个字符,每行一个换行符:

      #include <iostream>
      #include <fstream>
      #include <algorithm>
      #include <iterator>
      
      int main(int ac, char* av[])
      {
          std::ifstream in(ac == 1? "sudoko.init": av[1]);
          char board[9][9];
          for (int i(0); i != 9; ++i)
          {
              in.read(board[i], 9).ignore();
          }
          if (!in)
          {
              std::cout << "failed to read the initial board\n";
          }
          else
          {
              typedef std::ostream_iterator<char> iterator;
              std::fill_n(iterator(std::cout << "board:\n\n+", "+"), 9, '=');
              for (int i(0); i != 9; ++i)
              {
                  std::copy(board[i] + 0, board[i] + 9, iterator(std::cout << "\n|", "|"));
                  std::fill_n(iterator(std::cout << "\n+", "+"), 9, (i + 1) % 3? '-': '=');
              }
              std::cout << "\n";
          }
      }
      

      这需要这样的输入:

       4  5 3 8
      71   3   
         16  7 
         6 4  7
        6   8  
      1  9 5   
       6  42   
         5   94
      4 7 9  3 
      

      请注意,这些行中的每一行都使用 9 个字符。您可能想要使用更明显的东西,例如 .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        相关资源
        最近更新 更多