Чтение числовых данных из текстового файла на С++
Например, если данные во внешнем текстовом файле выглядят следующим образом:
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;
}
Ответы
Ответ 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;
}
}