Я хочу читать данные из файла с довольно странной структурой. Файл выглядит следующим образом:
some lines with text....
10 1000 10
1 1 1
1 100 100
.
.
.
some lines with text...
again data like above..
some lines with text... etc
Итак, у меня есть два вопроса:
Как я могу прочитать только конкретные строки с данными?
Как я могу прочитать эти правильно выровненные данные?
Вот одно из моих испытаний:
string line;
ifstream myfile ("aa.txt");
double a,b,c;
while (! myfile.eof() )
{
for (int lineno = 0; getline (myfile,line); lineno++)
if (lineno>2 && lineno<5){
myfile>>a>>b>>c;
cout<<lineno<<" " << line << endl;}}
myfile.close();
Как я могу прочитать только конкретные строки с данными?
хорошо, прочитайте все строки, а затем напишите функцию, чтобы определить, является ли текущая строка «данными» или нет.
Каковы характеристики вашей линии передачи данных? Он состоит только из цифр и пробелов? Могут ли быть вкладки? Как насчет столбцов, они фиксированной ширины? Ваша функция предиката может проверить наличие пробелов в обязательных столбцах, если это так.
Как я могу прочитать эти данные по правому краю?
Вы хотите извлечь целочисленные значения? Ну, вы можете создать std::istringstream
для вашей линии (как только вы проверили это является данные), а затем использовать >>
Оператор извлечения потока для чтения значений в переменные соответствующего типа.
Читайте о том, как он обрабатывает пробелы (и / или эксперимент) — он может просто делать то, что вам нужно, без усилий.
это просто простой пример: вы объявляете 3 переменные, как вы делали a, b, c, как целое число, а строковую строку вы открываете файл, а строка ввода преобразует строку в целое число, если все в порядке, присваиваете ее a, если не делаете ничего для b и c до следующего чтения, пока действительное преобразование для a не будет в порядке, затем введите b и c и вот так:
#include <iostream>
#include <string>
#include <fstream>int main()
{
std::ifstream in("data.txt");
int a = 0, b = 0, c = 0;
std::string sLine;
if(in.is_open())
{
while(in >> sLine)
{
if( a = atoi(sLine.c_str()))
std::cout << "a: " << a << std::endl;
if(a)
{
in >> sLine;
if( b = atoi(sLine.c_str()))
std::cout << "b: " << b << std::endl;
}
if(b)
{
in >> sLine;
if( c = atoi(sLine.c_str()))
std::cout << "c: " << c << std::endl;
}
}
}
in.close();
std::cout << std::endl;
return 0;
}