читать выровненные данные в переполнении стека

Я хочу читать данные из файла с довольно странной структурой. Файл выглядит следующим образом:

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

Итак, у меня есть два вопроса:

  1. Как я могу прочитать только конкретные строки с данными?

  2. Как я могу прочитать эти правильно выровненные данные?

Вот одно из моих испытаний:

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();

0

Решение

  1. Как я могу прочитать только конкретные строки с данными?

    хорошо, прочитайте все строки, а затем напишите функцию, чтобы определить, является ли текущая строка «данными» или нет.

    Каковы характеристики вашей линии передачи данных? Он состоит только из цифр и пробелов? Могут ли быть вкладки? Как насчет столбцов, они фиксированной ширины? Ваша функция предиката может проверить наличие пробелов в обязательных столбцах, если это так.

  2. Как я могу прочитать эти данные по правому краю?

    Вы хотите извлечь целочисленные значения? Ну, вы можете создать std::istringstream для вашей линии (как только вы проверили это является данные), а затем использовать >> Оператор извлечения потока для чтения значений в переменные соответствующего типа.

    Читайте о том, как он обрабатывает пробелы (и / или эксперимент) — он может просто делать то, что вам нужно, без усилий.

0

Другие решения

это просто простой пример: вы объявляете 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;
}
0

По вопросам рекламы [email protected]