Подтвердить что ты не робот

С++ Прочитайте файл по строкам, затем разделите каждую строку, используя разделитель

Я хочу прочитать файл txt за строкой и после прочтения каждой строки, я хочу разбить строку в соответствии с вкладкой "\ t" и добавить каждую часть к элементу в структуре.

my struct - 1 * char и 2 * int

struct myStruct
{
    char chr;
    int v1;
    int v2;
}

где chr может содержать более одного символа.

Строка должна выглядеть примерно так:

randomstring TAB number TAB number NL
4b9b3361

Ответ 1

Try:
Примечание: если chr может содержать более 1 символа, используйте строку для ее представления.

std::ifstream file("plop");
std::string   line;

while(std::getline(file, line))
{
    std::stringstream   linestream(line);
    std::string         data;
    int                 val1;
    int                 val2;

    // If you have truly tab delimited data use getline() with third parameter.
    // If your data is just white space separated data
    // then the operator >> will do (it reads a space separated word into a string).
    std::getline(linestream, data, '\t');  // read up-to the first tab (discard tab).

    // Read the integers using the operator >>
    linestream >> val1 >> val2;
}

Ответ 2

Если вы не собираетесь использовать эту структуру для C, я бы заменил предполагаемый char * на std::string.

Далее, поскольку я намерен читать его из потока, я бы написал следующую функцию:

std::istream & operator>>( std::istream & is, myStruct & my )
{
    if( std::getline(is, my.str, '\t') )
       return is >> my.v1 >> my.v2;
}

с str как член std::string. Это записывается в вашу структуру, используя вкладку в качестве первого разделителя, а затем любой разделитель белого пробела будет делать до следующих двух целых чисел. (Вы можете заставить его использовать вкладку).

Чтобы прочитать строку за строкой, вы можете либо продолжить чтение этих данных, либо сначала прочитать строку в строке, а затем поместить строку в поток istringstream и вызвать выше.

Вам нужно будет решить, как обрабатывать неудавшиеся чтения. Любое не прочитанное выше сообщение оставит поток в состоянии отказа.

Ответ 3

std::ifstream in("fname");
while(in){
    std::string line;
    std::getline(in,line);
    size_t lasttab=line.find_last_of('\t');
    size_t firsttab=line.find_last_of('\t',lasttab-1);
    mystruct data;
    data.chr=line.substr(0,firsttab).c_str();
    data.v1=atoi(line.substr(firsttab,lasttab).c_str());
    data.v2=atoi(line.substr(lasttab).c_str());
}