2016-07-02 3 views
0

я немного застрял на том, что я хочу сделать с моей C++ код:Возьмите только первые пять строк длинного списка, разделенных пустыми строками (C++)

int main() { 
char bid_price[512]; 
char bid_volume[512]; 
char ask_price[512]; 
char ask_volume[512]; 

const int MAX_LEN = 512; 
ifstream in_stream; 
in_stream.open("test.txt"); 

char current_string[MAX_LEN]; 

if (!in_stream) { 
    cout << "Could not open data.txt" << endl; 
    return false; 
} 

for (int i=0; i<150 && 
     (in_stream.getline(current_string,MAX_LEN) && current_string.length()==0); i++) { 
    in_stream.getline(current_string, MAX_LEN); 
    get_word(current_string, 1, bid_price); 
    cout << "First word is: " << bid_price << endl; 
    get_word(current_string, 2, bid_volume); 
    cout << "Second word is: " << bid_volume << endl; 
    get_word(current_string, 4, ask_price); 
    cout << "Third word is: " << ask_price << endl; 
    get_word(current_string, 5, ask_volume); 
    cout << "Fourth word is: " << ask_volume << endl; 
} 

in_stream.close(); 

return 0; 

}

Я хотелось бы сделать только первые пять строк такого списка в txt-файле, например:

  1. 383.80000 | 0,014 | 1461142717 || 383.67000 | 5.141 | 1461142798
  2. 383.61100 | 0,010 | 1461134871 || 383.60000 | 9.076 | 1461142798
  3. 383.51100 | 0,010 | 1461136836 || 383,46100 | 0,400 | 1461142794
  4. 383.41100 | 0,010 | 1461129820 || 383.35000 | 7,740 | 1461142798
  5. 383.31100 | 0,010 | 1461129821 || 383.30000 | 0,014 | 1461142637
  6. 383.21100 | 0,010 | 1461138430 || 383.20000 | 2.000 | 1461142787
  7. 383.16100 | 9.089 | 1461142763 || 383.11100 | 0,010 | 1461134135
  8. "EMPTY LINE"
  9. 383.01100 | 8,573 | 1461138900 || 383.00000 | 50.037 | 1461142501
  10. 382.98300 | 5.000 | 1461135929 || 382.97000 | 0.150 | 1461142461
  11. 382.93400 | 3,476 | 1461138822 || 382.91100 | 0,010 | 1461128348
  12. 382.81900 | 8,762 | 1461136840 || 382.81100 | 0,010 | 1461128350
  13. 382.80000 | 0,014 | 1461141922 || 382.71100 | 0,010 | 1461142621
  14. 382.68000 | 15.936 | 1461142797 || 382.67000 | 2.000 | 1461141655
  15. 382.66900 | 4.305 | 1461130920 || 382.61100 | 0,010 | 1461136076

В этом случае я бы только номер строки 1,2,3,4,5 и 9,10,11,12,13 Примечание: Nevermind функции get_word, она работает очень хорошо.

+0

Также выполните поиск близких совпадений с помощью «stackoverflow C++ read file struct» и «разделитель разделов с файлом stackoverflow». –

+0

Очевидно ли, что для чтения первых 5 строк вы бы изменили сравнение в вашем цикле 'for' до 5? –

+0

Pleaae, пожалуйста, не используйте массив символов для представления строк в C++. Когда это возможно, используйте вместо этого 'std :: string'. И я также не буду использовать 'endl', если вы не захотите явно очистить вывод консоли после каждой строки. – MikeMB

ответ

1

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

std::string text_line; 
while (getline(in, text_line)) 
{ 
    // If text line is blank, skip it 
    if (text_line.empty()) 
    { 
    continue; 
    } 

    // Otherwise process the text line. 
    // ... 
} 

Я настоятельно рекомендую вам добавить еще некоторые обнаружения ошибок для линий, которые не соответствуют формату.

Edit 1: Пропустив конкретные строки
Чтобы пропустить определенные строки, вам нужно будет иметь счетчик строк и контейнер строк, пропускаемых.

const unsigned int lines_to_skip[] = {8, 24, 25, 26, 101, 113, 125}; 
const unsigned int skip_list_size = sizeof(lines_to_skip)/sizeof(lines_to_skip[0]); 
std::string text_line; 
unsigned int line_counter = 0; 
unsigned int skip_index = 0; 
//... 
while (getline(in, text_line)) 
{ 
    ++line_counter; 
    if (skip_index < skip_list_size) 
    { 
    if (line_counter == lines_to_skip[skip_index]) 
    { 
     ++skip_index; 
     continue; 
    } 
    } 
    // Perform other validations 
    // ... 

    // Process the text line. 
} 

Пропуск пустых и недопустимых линий намного эффективнее, чем пропускание строк по номеру строки.

+0

У меня проблема, которую я не понимаю, а именно: error: запрос для члена 'empty' in 'current_string', который имеет тип non-class 'char [512]' if (current_string.empty()) { – sammtt

0

Вы хотите прочитать 5 строк и игнорировать пустые строки.

Итак, одним простым способом сделать это было бы сначала удалить все пустые строки из вашего набора данных, а затем просто захватить верхние 5 единиц.

Альтернативой будет отслеживание того, сколько строк вы успешно прочитали, и хотя эта переменная меньше 5, прочитайте еще одну. Затем увеличивайте счетчик только тогда, когда вы читаете непустую строку и не увеличиваете ее при пропуске пустой. Продолжайте до тех пор, пока счетчик не будет равен 5, или вам не удастся прочитать строки.

+0

I 'С удовольствием сделаем первый и легкий путь. Тем не менее, я не уверен, будет ли это работать, поскольку мне нужно захватить первые пять строк после пустой строки – sammtt