строковые члены не работают со строкой из файла, разделенного разделителем - PullRequest
0 голосов
/ 06 декабря 2018

Этот код должен печатать часть строки и ее последний символ, однако вторая часть после разделителя (:) печатает только строку, а не символ.Почему это не работает, и как я могу это исправить?

Код:

#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
string info;
void PrintTextFile(){
    ifstream myfile("example.txt");
    if(myfile.is_open()){
        while (getline(myfile, info, ':')){
            cout << info << "   " << info.back() << "\n";    
        }
        myfile.close();
    }
    else {
        cout << "Unable to open file.";
    }
}

int main(int argc, char *argv[]) {    
    PrintTextFile();
    return 0;
}

example.txt:

Left1:Right1
Left2:Right1
Left3:Right3

Мой вывод:

Left1        1
Right1
Left2        2
Right2
Left3        3
Right3

Ожидаемый результат:

Left1        1
Right1       1
Left2        2
Right2       2
Left3        3
Right3       3

1 Ответ

0 голосов
/ 06 декабря 2018

Проблема здесь в том, что когда вы задаете свой собственный разделитель для getline, он перестает использовать символ новой строки в качестве разделителя.Это означает, что в вашем первом цикле вы читаете в Left1:, отбрасываете :, а info остается с Left1.Вторую итерацию, которую вы снова читаете, пока не увидите :, поэтому вы читаете в Right1\nLeft2:, отбросьте :, оставляя info с Right1\nLeft2.

Что вам нужно сделать, это либочитать всю строку, а затем использовать поток строк, чтобы разобрать его, как

while (getline(myfile, info)){
    stringstream ss(info)
    while (getline(ss, info, ':') // this works now because eof will also stop getline
        cout << info << "   " << info.back() << "\n";    
}

Или, поскольку вы знаете, что вам просто нужно два значения, получите их оба, прочитав каждую часть строки, как

while (getline(myfile, info, ':')){
    cout << info << "   " << info.back() << "\n";  
    getline(myfile, info);
    cout << info << "   " << info.back() << "\n";  
}
...