2016-02-14 4 views
-1

я следующие данные в текстовом файле:C++. Чтение из текстового файла. Каждый второй сегмент отсутствует

... 
A,Q1,1 
S,a1,a1 
S,a2,a2 
S,a3,a3 
A,Q1,1 
S,b1,b1 
S,b2,b2 
S,b3,b3 
A,Q1,1 
S,c1,c1 
S,c2,c2 
S,c3,c3 
A,Q1,1 
S,d1,d1 
S,d2,d2 
S,d3,d3 
A,Q2,1 
S,x1,x1 
S,x2,x2 
S,x3,x3 
... 

Я использую следующий код для извлечения данных:

std::string MyClass::getData(const std::string& icao) 
{ 
    // Final String 
    std::string finalData = ""; 

    // Path to the Navigraph Navdata 
    std::string path = getPath(); 

    std::string dataFilePathSmall = navdataFilePath + "ats.txt"; 

    // Create file streams 
    std::ifstream ifsSmall(dataFilePathSmall.c_str()); 

    // Check if neither of the files exists. 

    if (!ifsSmall.is_open()) 
    { 
     // If it does not exist, return Not Available 
     finalData = "FILE NOT FOUND"; 
    } 

    // If the file 'ats.txt' exists, pull the data relevant to the passed ICAO code 
    if (ifsSmall) 
    { 
     // We need to look a line starting with the airway prefixed by "A," and suffixed by ',' 
     const std::string search_string = "A," + icao + ','; 

     // Read and discard lines from the stream till we get to a line starting with the search_string 
     std::string line; 

     // While reading the whole documents 
     while (getline(ifsSmall, line)) 
     { 
      // If the key has been found... 
      if (line.find(search_string) == 0) 
      { 
       // Add this line to the buffer 
       finalData += line + '\n'; 

       // ...keep reading line by line till the line is prefixed with "S" 
       while (getline(ifsSmall, line) && (line.find("S,") == 0)) 
       { 
        finalData += line + '\n'; // append this line to the result 
       } 
      } 
     } 

     // If no lines have been found 
     if (finalData == "") 
     { 
      finalData = "CODE NOT FOUND"; 
     } 
    } 

    // Close the streams if they are open 
    if (ifsSmall) 
    { 
     ifsSmall.close(); 
    } 

    return finalData; 
} 

Теперь моя проблема заключается в том, что по какой-то причине , каждый второй сегмент данных не читается. То есть, я получаю следующее:

A,Q1,1 
S,a1,a1 
S,a2,a2 
S,a3,a3 
A,Q1,1 
S,c1,c1 
S,c2,c2 
S,c3,c3 

Я не могу понять, что именно в моем коде отсутствует. Заранее большое спасибо!

+0

Почему было проголосовано? Время будет потрачено более эффективно, если бы вы могли помочь. –

ответ

3
while (getline(ifsSmall, line) && (line.find("S,") == 0)) 

будет читать строку и проверять, начинается ли она с "S". Если он не начинается с «S», линия все еще читается. То же самое верно для вашего времени +, если чтение строк начинается с «A».

+0

Спасибо. Теперь это имеет смысл. Попытка выяснить, как это решить ... –

1

Внутренний цикл считывает строку, не начинающуюся с «S», а затем завершается. Это строка, начинающаяся с «A», которую вы отсутствуете. Затем внешний цикл считывает другую строку, поэтому он пропускает начало раздела.

Попробуйте использовать только один цикл и один getline().

+0

Спасибо. Не уверен, хотя в этом конкретном случае можно использовать только один цикл и getline. –

+0

На самом деле я не понимаю, зачем вам нужен внутренний контур. Кажется, он делает то же самое, что и внешний цикл (добавьте текущую строку в строку). –

+0

Поскольку предполагается продолжить чтение файла до тех пор, пока не появится необходимый префикс. В противном случае я не вижу, как будут добавлены все строки, начинающиеся с «S», которые следуют за первой найденной строкой. Он работал отлично, когда между сегментами была пустая строка, но вот так выглядит база данных, и я не могу с ней поделать. –