чтение ввода из середины файла С++ с использованием циклов for

Я пытаюсь написать фиктивную программу книжного магазина. Программа должна считывать данные из одного входного файла и записывать их в один выходной файл. У меня есть несколько ограничений. Я могу использовать только один входной файл и один выходной файл. Я должен использовать два цикла for. По одному на каждого из пяти клиентов, перечисленных в файле, и по одному на каждую из книг, которые они собираются купить, с возможностью до 5 книг.

Первый цикл for вводит информацию о покупателе и количество книг, которые нужно купить (поэтому следующий цикл for будет знать, сколько раз нужно выполнить итерацию). Второй цикл принимает информацию о книгах.

Проблема: я знаю, как предотвратить запись выходного файла поверх себя, но как заставить входной файл читать с того места, где остановилась последняя итерация цикла.

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

for(count=1; count<=5; count++)
   {
   fin.open("input.txt");
   fin << user information(including name, address and number of books)
   fout.open("output.txt" ios::app);
   fout >> user information

   for(count1=1; count1<=numbbooks; count1++)
      {
      fin << book information(Name, Author, Price)
      fout >> book information
      }

Я знаю, как использовать getline, fin для получения данных, однако после первой итерации каждого цикла он начинает читать с начала файла. Мне нужно, чтобы он читал с того места, где закончилась предыдущая итерация. Я понимаю ios:app для вывода.

образец входного файла

user name
address
number of books
book1
price1
book2
user name2
address
number of books
book2.1
price2.1

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


person user1768079    schedule 23.10.2012    source источник


Ответы (2)


Просто не открывайте и не закрывайте его каждый раз по кругу. Откройте его один раз перед внешним циклом и один раз закройте после того же цикла.

Когда вы открываете файл, позиция чтения/записи обычно устанавливается в начало файла (ios::app является исключением, как вы уже выяснили).

person john    schedule 23.10.2012
comment
Я переместил fin.open(input.txt) и fout.open(output.txt) за пределы внешнего цикла for, теперь он выполняет чтение только внутри первого цикла - person user1768079; 23.10.2012
comment
Привет. Назад снова. Извинения. Это сработало. У меня все еще был один остаток fout.open, который я еще не удалил. Честно говоря, именно так я бы и поступил в первую очередь, но если процитировать инструкции: внешний цикл FOR будет повторяться для каждого клиента. Внутренний цикл FOR будет повторяться для каждой книги, купленной покупателем внешнего цикла. Поскольку данные недоступны вне цикла, открывайте и закрывайте каждый файл внутри цикла. - person user1768079; 23.10.2012
comment
@user1768079 user1768079 Инструкции кажутся мне мусором. - person john; 23.10.2012
comment
Согласовано. Спасибо еще раз. Я не уверен, как сделать это закрытым, но это ответило на мой вопрос. - person user1768079; 23.10.2012

У вас неправильные символы << и >>.

Создайте структуру (или класс) для UserInformation и BookInformation, затем создайте эти перегрузки:

std::ostream& operator<<( std::ostream& os, const UserInformation& );
std::istream& operator>>( std::istream& is, UserInformation& );
std::ostream& operator<<( std::ostream& os, const BookInformation& );
std::istream& operator>>( std::istream& is, BookInformation& );

каждый из них будет читать или писать в члены вашей структуры.

В вашем внешнем цикле вы также должны только читать/писать, а не открывать файлы, поэтому переместите их за пределы циклов так:

fin.open("input.txt");         
fout.open("output.txt" ios::app);      

// verify both fin and fout worked correctly then
UserInformation userInfo;
while( fin >> userInfo ) // or use a count if you only want to read a limited number
{
     // continue with reading books and outputting..
}
person CashCow    schedule 23.10.2012
comment
Он просто ошибся в псевдокоде. Вопрос не в этом. - person interjay; 23.10.2012
comment
Извините, сейчас 6:38 утра. Я не спал всю ночь, пытаясь закончить это дело. Фактический код значительно длиннее этого. Это единственная часть, которая не работает должным образом. - person user1768079; 23.10.2012
comment
Ну, скорее всего, ошибка заключалась в том, что файл открывался больше раз во время цикла. - person CashCow; 23.10.2012