crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Помогите найти ошибку (запись в файл)
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Tonal Дата 13.10.2008, 7:52
  2 ++Norton++ В твоём примере с cat-ами работают 2 программы: cat и шел.
когда ты запускаешь cat, шел открывает для него поток ввода.
При нажатии Ctrl+D шел закрывает поток ввода для текущей запущенной программы. cat ловит это как конец файла и завершается.
При повторном вызове cat-а, всё повторяется.

Т.е. если ты хочешь воспроизвести это поведение, тебе нужно или напрямую управлять терминалом и самому ловить Ctrl+D (по умолчанию его ловит шел), либо придумать какой-нибудь другой признак окончания ввода файла.
Например это может быт строка "EOF". Тогда твоя функция пишет файл, пока не считала эту спец.строку или конец файла.
Если считала конец файла - всё, если считала спец.строку - можно ещё раз запуститься и читать дальше.

П.С. На винде аналогом Ctrl+D является Ctrl+Z
П.П.С. По моему к Qt тема имеет весьма слабое отношение. Ей в "Техника программирования" место, или в "Другое". :)
Litkevich Yuriy Дата 13.10.2008, 2:07
 
Цитата(++Norton++ @ 13.10.2008, 3:38) *
передается управление опять функции main()
а ты выйди из приложения и все
++Norton++ Дата 13.10.2008, 0:00
  Нет, опять то, что введет пользователь. В общем когда функция main() считывает:
cat > name_file

Если ввод такой, то вызывается как раз эта функция catFile(); пользователь вводит данные (так, как я писал выше), нажимает ctrl+D, введенные данные сохраняются в файл name_file, и происходит возврат опять в функцию main. Здесь пользователь опять может ввести:
cat > name_file2

И повторить эту же процедуру, но в name_file2 ввести уже другие данные. Только это как раз и не получается. В этом втором вызове просто создается пустой файл name_file2 и происходит возврат в main().
AD Дата 12.10.2008, 23:40
 
Цитата(++Norton++)
Просто после выполнения этой функции не происходит выход из программы (передается управление опять функции main()). И если например пользователю нужно создать сразу же еще один текстовый файл (после создания первого), тогда нужно осуществить еще один вызов функции.

А что должно быть в этом 2 файле? То же самое, что в первом?
++Norton++ Дата 12.10.2008, 23:38
  Просто после выполнения этой функции не происходит выход из программы (передается управление опять функции main()). И если например пользователю нужно создать сразу же еще один текстовый файл (после создания первого), тогда нужно осуществить еще один вызов функции.
Litkevich Yuriy Дата 12.10.2008, 22:28
  ++Norton++, дак тебе зачем вызывать функцию несколько раз?
При первом вызове, она съест все строчки и вывидит их в файл, см. мой пост №12, именно это и происходит, в виндовозе покрайней мере. Хоть там и нет <Ctrl>+<D>
++Norton++ Дата 12.10.2008, 22:22
  Tonal
Мне нужно написать функцию, которая бы считывала строку за строкой, введенные пользователем в stdin и потом, все то, что он вводил записалось в файл. При нажатии Enter, выполнение функции не должно прекращаться (как в любом текстовом редакторе. Это просто переход на следующую строку).
Т.е:
1. Вызывается функция и пользователь вводит в консоли (именно так, строку за строкой):
12345
67890
123123

2. Когда все написано, посылает сигнал о прекращении выполнения функции ( в моем случае это был ctrl+D, но полного успеха как видно нет).
3. Все то, что он ввел, записывается в файл (точно так же строка за строкой). Т.е. содержимое файла примет вид:
12345
67890
123123

Вот собственно и вся задача.
Litkevich Yuriy Дата 12.10.2008, 15:49
  Tonal, посмотри пожалуйста тему QTextStream, operator<< работает асинхронно?, для меня поведение ввода/вывода неимеет объяснение
Tonal Дата 12.10.2008, 12:20
  cat>file как бы тоже не перезапускается.
Так что приведённые функции работают совершенно аналогично.
Насколько я понимаю, шел по Ctrl+D просто закрывает пайп ввода, так что бессмысленно пытаться что-то ещё с ним зделать после этого.

Объясни ещё раз, чего именно ты пытаешся добиться?
++Norton++ Дата 12.10.2008, 11:22
  К сожалению, не то ни другое не подходит. Перед while пробовал ставить и in.seek(0) и in.reset(); но результат такой же... :(
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 13:56