Getting input from external files?

后端 未结 4 2007
我在风中等你
我在风中等你 2021-01-28 11:36

I need to get very basic input from an external file in C++. I tried searching the internet a few times but nothing really applied to what I need. This would be a .txt file that

相关标签:
4条回答
  • 2021-01-28 11:53

    Aside from the other suggestions, you can simply redirect a file to standard input, like so (where $ is the command prompt):

    $ myprogram < mytextfile.txt
    

    That will run myprogram just as normal but take input from mytextfile.txt as if you had typed it in. No need to adjust your own program at all.

    (This works on both Unix/Linux systems and on Windows.)

    0 讨论(0)
  • 2021-01-28 11:54

    You can open a file for input with std::ifstream from the header <fstream>, then read from it as you would from std::cin.

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

    Obviously, you can use >> in a loop to read multiple numbers.

    0 讨论(0)
  • 2021-01-28 12:02

    Personally, I would start with a different format of the file: enter a value for each cell. That is, each row in the input file would represent a row in the sudoko board. Empty fields would use a space character. The immediate advantage is that the input actually pretty much looks like the sudoko board. Also, you would enter at most 90 characters: 9 characters for the board and a newline for each line:

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

    This would take input like this:

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

    Note that each of these lines uses 9 characters. You might want to use something more visible like ..

    0 讨论(0)
  • 2021-01-28 12:08

    Create an std::ifstream object, and read from it just like you would from std::cin. At least if I understand what you're trying to do, the 131 as the first input is really intended to be three separate numbers (1, 3, and 1). If so, it's probably easiest to change your input file a bit to put a space between each:

    1 3 1
    2 4 1
    3 7 1
    4 8 1
    
    0 讨论(0)
提交回复
热议问题