crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Помогите найти ошибку (запись в файл)
++Norton++
  опции профиля:
сообщение 11.10.2008, 13:17
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Есть функция, которая выполняет запись в файл:
int catFile(QString param, QString nof)
{
  int i;
  QStringList content;
  QFile file(nof);

  if(param==">")
  {
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
         return 1;
    QTextStream in(stdin);

    while(!in.atEnd())
    {
      content.append(in.readLine()+"\n");
    }
     QTextStream out(&file);
     for(i=0; i<content.count(); i++)
     {
       out << content.at(i);
     }
     file.close();
     return 0;
  }
}

Дело в том, что при ее первом вызове, все работает нормально. Если следом ее вызвать второй раз, она просто создает пустой файл (т.е. пробрасывает стадию while(!in.atEnd)). Что может быть не так?
Причина редактирования: форматирование понагляднее и скобка потерялась
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.10.2008, 14:19
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Ну насколько я понимаю, тебе следует каким-нибудь образом указать потоку ввода stdin, чтобы он переместил указатель на начало и считывал введенные данные по новой. Как именно, почитай QIODevice, QFile.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.10.2008, 16:45
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(++Norton++ @ 11.10.2008, 17:17) *
while(!in.atEnd())
{
content.append(in.readLine()+"\n");
}
вот эти строчки объясни.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 11.10.2008, 19:19
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


И чё тут странного?
Ты в первый раз выгребаешь всё из stdin.
Во второй запуск там естественно уже ничего нет - он как встал в режим atEnd в первый раз, так там и стоит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
++Norton++
  опции профиля:
сообщение 11.10.2008, 22:28
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Litkevich Yuriy, эта строчка читает со стандартного ввода линию и заносит ее в QStringList.
На счет режима atEnd()... а можно как-нибудь вывести из этого режима, чтобы и при последующих запусках все работало как надо?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.10.2008, 22:34
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(++Norton++ @ 11.10.2008, 23:28) *
Litkevich Yuriy, эта строчка читает со стандартного ввода линию и заносит ее в QStringList.
На счет режима atEnd()... а можно как-нибудь вывести из этого режима, чтобы и при последующих запусках все работало как надо?

Объясните корректно, пожалуйста, чего Вы хотите добиться. Неясно какой результат нужен! :))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.10.2008, 22:40
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(++Norton++ @ 12.10.2008, 2:28) *
со стандартного ввода линию и
читает строку, а сама строка чем заканчивается? <Ctrl>+<D>? т.е. это не прерывает ввод данных, а только сигналит о завершении строки?
Я так понимаю ты все это делаешь в GNU/Linux

Цитата(AD @ 12.10.2008, 2:34) *
Объясните корректно, пожалуйста, чего Вы хотите добиться. Неясно какой результат нужен! )))
Присоеденяюсь.
Лучше объясни каков должен быть результат работы модуля/программы, возможно все проще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
++Norton++
  опции профиля:
сообщение 11.10.2008, 22:44
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 98
Регистрация: 5.10.2008
Пользователь №: 380

Спасибо сказали: 0 раз(а)




Репутация:   1  


Да, все делаю в Linux.
Просто нужна функция, которая работала бы аналогично линуксовой команде (cat > file.name). Т.е. читала строку за строкой что вводит пользователь и потом записывала в файл. Если пользователь нажимает Enter, нужно просто перейти на следующую строку, но не закончить выполнение. Закончить выполнение нужно тогда, когда пользователь нажмет ctrl+D.

Сообщение отредактировал ++Norton++ - 11.10.2008, 22:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 11.10.2008, 22:53
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(++Norton++ @ 11.10.2008, 23:44) *
Да, все делаю в Linux.
Просто нужна функция, которая работала бы аналогично линуксовой команде (cat > file.name). Т.е. читала строку за строкой что вводит пользователь и потом записывала в файл. Если пользователь нажимает Enter, нужно просто перейти на следующую строку, но не закончить выполнение. Закончить выполнение нужно тогда, когда пользователь нажмет ctrl+D.

Хорошо, а как она делает по тому коду, что здесь был приведен? Не работаю в Линукс, поэтому смогу помочь, когда узнаю все подробности! :))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.10.2008, 23:00
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9648
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(++Norton++ @ 12.10.2008, 2:44) *
Если пользователь нажимает Enter, нужно просто перейти на следующую строку, но не закончить выполнение. Закончить выполнение нужно тогда, когда пользователь нажмет ctrl+D.
А разве ввод не прекращается при нажатии <Enter>?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.9.2018, 17:47