Подтвердить что ты не робот

Чтение числовых данных из текстового файла на С++

Например, если данные во внешнем текстовом файле выглядят следующим образом:

45.78   67.90   87
34.89   346     0.98

Как я могу прочитать этот текстовый файл и присвоить каждому номер переменной в С++? Используя ifstream, я могу открыть текстовый файл и назначить первый номер переменной, но я не знаю, как читать следующий номер после пробелов.

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    float a;
    ifstream myfile;
    myfile.open("data.txt");
    myfile >> a;
    cout << a;
    myfile.close();
    system("pause");
    return 0;
}

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int data[6], a, b, c, d, e, f;
    ifstream myfile;
    myfile.open("a.txt");

    for(int i = 0; i << 6; i++)
        myfile >> data[i];

    myfile.close();
    a = data[0];
    b = data[1];
    c = data[2];
    d = data[3];
    e = data[4];
    f = data[5];
    cout << a << "\t" << b << "\t" << c << "\t" << d << "\t" << e << "\t" << f << "\n";
    system("pause");
    return 0;
}
4b9b3361

Ответ 1

Повторить → читает в цикле.

#include <iostream>
#include <fstream>
int main(int argc, char * argv[])
{
    std::fstream myfile("D:\\data.txt", std::ios_base::in);

    float a;
    while (myfile >> a)
    {
        printf("%f ", a);
    }

    getchar();

    return 0;
}

Результат:

45.779999 67.900002 87.000000 34.889999 346.000000 0.980000

Если вы точно знаете, сколько элементов в файле, вы можете связать → оператор:

int main(int argc, char * argv[])
{
    std::fstream myfile("D:\\data.txt", std::ios_base::in);

    float a, b, c, d, e, f;

    myfile >> a >> b >> c >> d >> e >> f;

    printf("%f\t%f\t%f\t%f\t%f\t%f\n", a, b, c, d, e, f);

    getchar();

    return 0;
}

Изменить: В ответ на ваши комментарии в главном вопросе.

У вас есть два варианта.

  • Вы можете запустить предыдущий код в цикле (или двух циклах) и выбросить определенное количество значений - например, если вам нужно значение в точке (97, 60), вам нужно пропустить 5996 (= 60 * 100 + 96) и использовать последний. Это будет работать, если вас интересует только указанное значение.
  • Вы можете загрузить данные в массив - как сказал Джерри Коффин. Он уже дал вам довольно хороший класс, который решит проблему. Кроме того, вы можете использовать простой массив для хранения данных.

Изменить: Как пропустить значения в файле

Чтобы выбрать значение 1234, используйте следующий код:

int skipped = 1233;
for (int i = 0; i < skipped; i++)
{
    float tmp;
    myfile >> tmp;
}
myfile >> value;

Ответ 2

Это может зависеть, особенно от того, будет ли ваш файл иметь одинаковое количество элементов в каждой строке или нет. Если да, то вам, вероятно, нужен 2D-матричный класс, обычно что-то вроде этого:

class array2D { 
    std::vector<double> data;
    size_t columns;
public:
    array2D(size_t x, size_t y) : columns(x), data(x*y) {}

    double &operator(size_t x, size_t y) {
       return data[y*columns+x];
    }
};

Обратите внимание, что, поскольку оно написано, это предполагает, что вы знаете размер, который вам нужен. Этого можно избежать, но код становится немного больше и сложнее.

В любом случае, чтобы прочитать числа и сохранить исходную структуру, вы обычно читаете строку за раз в строке, а затем используйте строковый поток для чтения чисел из строки. Это позволяет хранить данные из каждой строки в отдельной строке в вашем массиве.

Если вы не знаете размер раньше времени или (особенно), если разные строки могут не содержать одинаковое количество чисел:

11 12 13
23 34 56 78

Вместо этого вы можете использовать std::vector<std::vector<double> >. Это накладывает некоторые накладные расходы, но если разные строки могут иметь разные размеры, это простой способ выполнить эту работу.

std::vector<std::vector<double> > numbers;

std::string temp;

while (std::getline(infile, temp)) {
    std::istringstream buffer(temp);
    std::vector<double> line((std::istream_iterator<double>(buffer)),
                             std::istream_iterator<double>());

    numbers.push_back(line);
}

... или, используя современный (С++ 11) компилятор, вы можете использовать скобки для инициализации line:

    std::vector<double> line{std::istream_iterator<double>(buffer),
                             std::istream_iterator<double>()};

Ответ 3

Оператор ввода для числа пропускает ведущие пробелы, поэтому вы можете просто прочитать число в цикле:

while (myfile >> a)
{
    // ...
}

Ответ 4

вы могли читать и писать отдельно, как и другие. Но если вы хотите записать в один и тот же, вы можете попробовать:

#include <iostream>
#include <fstream>

using namespace std;

int main() {

    double data[size of your data];

    std::ifstream input("file.txt");

    for (int i = 0; i < size of your data; i++) {
        input >> data[i];
        std::cout<< data[i]<<std::endl;
        }

}