-3

Я пытаюсь прочитать несколько значений из текстового файла и сохранить их в памяти.Создание кода на C++ более эффективно, а если оператор не работает

Это то, что файл может хранить или выглядеть

Пример 1 - файл хранения кассира имя, возраст и название должности

* Cashier Name: Bill Age: 25 Job Title: Cashier *

Пример 2 - Файл хранения имя кассира , возраст и должность

* Cashier Name: Mark Age: 37 Job Title: Manager *

Пример 3 - файл хранения наличных Имя МЭО, возраст, название работы, а также зоны покрыты

* Cashier Name: Sam Age: 45 Job Title: Area Manager Areas Covered: Manchester, Liverpool *

Пример 4 - Файл, хранящий имя кассира, возраст, должность, области прикрыта, а тип людей, этот человек управляет

* Cashier Name: Dave Age: 50 Job Title: Regional Manager Areas Covered: Derby, Manchester, Liverpool Manages: Area Managers *

В принципе, я пытаюсь реализовать небольшую программу, которая может хранить имена кассиров, их возраст и названия работы в файле .txt, а затем для извлечения этих значений в память. Я могу получить значения для первого и второго примеров, однако мне трудно получить и сохранить значения для третьего и четвертого примеров. Мой блок if, else if, else, похоже, не работает и не эффективен (т. Е. Может ли код использоваться повторно)?

Это мой код

istream& inputWorkers(istream& is, Workers * & workers) 
    { 
     char d1, d2; 
     string cashName, name, cashAge, cashTitle, title, cashAreas, areas, cashManages, manages; 
     int age; 
     if(is >> d1 >> cashName >> name >> cashAge >> age >> cashTitle >> title >> d2) 
    { 
     *workers = Workers(name, age, title); // Segmentation error 
    } 
    else if(is >> d1 >> cashName >> name >> cashAge >> age >> cashTitle >> title >> cashAreas >> areas >> d2) 
    { 
    *workers = AreaMangers(name, age, title, areas); // Segmentation error 
    } 
    else if(is >> d1 >> cashName >> name >> cashAge >> age >> cashTitle >> title >> cashAreas >> areas >> cashManages >> manages >> d2) 
    { 
    *workers = RegionalMangers(name, age, title, areas, manages); // Segmentation error 
    } 
    else 
    { 
    return is.setstate(badbit); 
    } 
    return is; 
    } 

Я получаю ошибку сегментации слишком, и я не знаю, почему. Я пытался следить за видео на YouTube и читать статьи. Любая помощь будет оценена.

Благодаря

+3

Прежде чем просить об эффективности, исправьте свой код, чтобы он работал. Также видео не являются хорошей заменой для книг или достойных учебников IMHO. –

+1

Я действительно говорил, что он не работает. «Я тоже получаю ошибки сегментации». –

+4

_ «Я тоже получаю ошибки сегментации». Тогда ваш код не работает **, период. Отправьте сообщение [MCVE] и покажите свои усилия по отладке, подробно объясните свои проблемы. –

ответ

1

Я думаю, ваша проблема в том, что вы пытаетесь ввести свои значения при тестировании их. Подумайте, что на самом деле делает каждое заявление ввода (внутри вашего условия if). Он читает, пока не получится ошибка. Затем, прочитав единственную строку в файле, вы переходите к следующей строке и пытаетесь прочитать NEXT (несуществующую) строку.

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

0

Если первый if не работает, это означает, что произошла ошибка чтения из потока, а поток будет находиться в состоянии fail. После этого вы ничего не сможете прочитать (если вы не сбросите состояние), так что следующие два условия if также не сработают, то есть вы никогда не сможете попасть в блоки else if.

Вы, вероятно, хотите что-то вроде этого псевдокода вместо:

read whole line into a string 
split the string into whitespace-separated words 
if (number of words == 8) 
{ 
    parse words 
    create Workers 
} 
else if (number of words == 10) 
{ 
    parse words 
    create AreaManagers 
} 
else if (number of words == 12) 
{ 
    parse words 
    create RegionalManagers 
} 

Следующая проблема здесь:

*workers = AreaMangers(name, age, title, areas); // Segmentation error 

присваивается объект типа AreaManagers на объект типа Workers, который выиграл» т делать то, что вы, вероятно, ожидаете. Вы не можете изменить тип *workers, присвоив ему что-то другое. Может быть, вы хотите сделать что-то вроде:

workers = new AreaManagers(name, age, title, areas); 

но теперь вы динамически выделенную память и нужно освободить его правильно, так что было бы лучше использовать смарт-указатель, такой как shared_ptr<Workers> вместо того, Workers*

Наконец, факт, что ваши назначения вызывают ошибку сегментации, не очень хорош, вы должны протестировать копирование типа в изоляции и убедиться, что оно правильно, не только сделать это как часть сложного заявления if-else, который не работает.