Получать входные данные из внешних файлов? - PullRequest
0 голосов
/ 08 января 2012

Мне нужно получить очень простой ввод из внешнего файла в 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, и пользователь вводит строку, столбец и число, полученные с доски.
Мне нужно создать файл .txt с этими номерами, хранящимися в строках, чтобы мне не приходилось вводить так много чисел. Я очень мало представляю, как это сделать. В основном я буду использовать только txt-файл для тестирования своей программы, так как я добавляю в нее больше кода. В моей программе требуется более 150 введенных номеров, чтобы получить единую доску, и это занимает много времени. Любое случайно неверно введенное значение также является большой проблемой, так как мне приходится начинать заново. Так как же заставить C ++ читать текстовый файл и использовать эти числа в качестве входных данных?

Ответы [ 4 ]

5 голосов
/ 08 января 2012

Помимо других предложений, вы можете просто перенаправить файл на стандартный ввод, например, так (где $ - командная строка):

$ myprogram < mytextfile.txt

Это будет работать myprogram как обычноно берите данные из mytextfile.txt, как если бы вы их набрали. Не нужно вообще настраивать свою собственную программу.

(Это работает как в системах Unix / Linux, так и в Windows.)

2 голосов
/ 08 января 2012

Создайте std::ifstream объект и читайте из него так же, как если бы вы std::cin. По крайней мере, если я понимаю, что вы пытаетесь сделать, 131 в качестве первого ввода на самом деле должно быть тремя отдельными числами (1, 3 и 1). Если это так, то, вероятно, проще всего немного изменить входной файл, чтобы между ними был пробел:

1 3 1
2 4 1
3 7 1
4 8 1
2 голосов
/ 08 января 2012

Вы можете открыть файл для ввода с помощью std::ifstream из заголовка <fstream>, а затем прочитать его, как если бы вы std::cin.

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

Очевидно, что вы можете использовать >> в цикле для чтения нескольких чисел.

0 голосов
/ 08 января 2012

Лично я бы начал с другого формата файла: введите значение для каждой ячейки. То есть каждая строка во входном файле будет представлять строку на доске судоко. Пустые поля будут использовать пробел. Непосредственным преимуществом является то, что вход на самом деле выглядит как доска судоко. Кроме того, вы должны ввести не более 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 символов. Возможно, вы захотите использовать что-то более заметное, например ..

...