crossplatform.ru

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

4 страниц V   1 2 3 > »   
Тема закрытаНачать новую тему
> [РЕШЕНО] Работа с функцией seek, адаптация при работе с SetFilePointer
AD
  опции профиля:
сообщение 25.2.2010, 23:15
Сообщение #1


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

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

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




Репутация:   17  


Необходимо установить указатель файла в конец файла. Как это сделать?
Для того, чтобы установить в начало файла есть функция reset(), а для окончания файла?

Cобcтвенно говоря, мне необходимо правильно перевести следующие строки кода на Qt:
int dwPtr = SetFilePointer(*WriteHandle, 0, NULL, FILE_END);
    int dwError;
    if (dwPtr == INVALID_SET_FILE_POINTER) // Test for failure
{
    // Obtain the error code.
    dwError = GetLastError();

    // Deal with failure.
    // . . .

} // End of error handler

    offset = 0;

WriteHandle - указатель на файл (библиотека карт), куда записывается информация из других файлов. ReadHandle - читаемый на данный файл (карта), откуда эту информацию считывают. Мне важно понять как правильно перевести на Qt-шный стиль строчку кода:
int dwPtr = SetFilePointer(*WriteHandle, 0, NULL, FILE_END);

Заранее спасибо.

Сообщение отредактировал AD - 28.2.2010, 15:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 26.2.2010, 0:30
Сообщение #2


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

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

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




Репутация:   2  


Цитата(AD @ 25.2.2010, 23:15) *
Мне важно понять как правильно перевести на Qt-шный стиль строчку кода:
int dwPtr = SetFilePointer(*WriteHandle, 0, NULL, FILE_END);

Заранее спасибо.

зачем тебе Qt, если можно перевести чисто на C++:
istream &istream::seekg(streamoff off, ios_base::seekdir dir);


Сообщение отредактировал DEADHUNT - 26.2.2010, 0:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 0:46
Сообщение #3


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

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

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




Репутация:   17  


Цитата(DEADHUNT @ 26.2.2010, 0:30) *
зачем тебе Qt, если можно перевести чисто на C++:
istream &istream::seekg(streamoff off, ios_base::seekdir dir);

Да я знаю, что можно и вообще чистыми Си-шными функциями обойтись. Нужен Qt, потому что все остальное работает на Qt-шных файлах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 26.2.2010, 1:15
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Цитата(AD @ 25.2.2010, 23:15) *
Для того, чтобы установить в начало файла есть функция reset(), а для окончания файла?

Ну если на конец, то можно закрыть его (если он был открыт) и открыть в режиме добавления...Тогда курсор железно в конце будет.
Зы. Я например все потоковые операции только через std::ios делаю... Во-первых просто потому что привык, во-вторых никаких потерь "кроссплатформенности"... Вот кстати еще интересно бы сравнить по скорости, кто быстрее.) Потоковые в смысле текстовых файлов.

Сообщение отредактировал Rocky - 26.2.2010, 1:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.2.2010, 1:54
Сообщение #5


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Только два варианта.

QFile file("myfile");
if (!file.open(QIODevice::Append) {
    qDebug() << file.errorString();
    return false;
}


QFile file("myfile");
if (!file.open(QIODevice::ReadWrite) {
    qDebug() << file.errorString();
    return false;
}
file.seek(file.size()); // Qt сама использует этот метод


Ставить отрицательные значения не рекомендую, если для windows это может переместить указатель в обратную сторону, то в реализации для *nix метод вернет ошибку, так как в отличае от виндовой версии там стоит проверка значения смещения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 10:17
Сообщение #6


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

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

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




Репутация:   17  


Цитата(SABROG @ 26.2.2010, 1:54) *
QFile file("myfile");
if (!file.open(QIODevice::ReadWrite) {
    qDebug() << file.errorString();
    return false;
}
file.seek(file.size()); // Qt сама использует этот метод

Такой вариант и сделал. Система попросту зависает (по рабоче-крестьянски, уходит в "глубокий ахтунг"). Фиг знает, почему!

Если делать по первому варианту, я смогу после открытия файла с флагом QIODevice::Append перемещаться по файлу, когда мне это понадобиться?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2010, 10:45
Сообщение #7


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

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

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




Репутация:   94  


Цитата(AD @ 26.2.2010, 13:17) *
Система попросту зависает (по рабоче-крестьянски, уходит в "глубокий ахтунг"). Фиг знает, почему!
а что возвращает функция size() для этого файла?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 11:02
Сообщение #8


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 26.2.2010, 10:45) *
а что возвращает функция size() для этого файла?

Cейчас обнаружил, что именно на ней и уходит куда-то далеко. Если пытаться через второй вариант, то то же самое при попытке закрыть файл. Не понимаю, как избавиться от этих глюков.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2010, 13:11
Сообщение #9


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

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

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




Репутация:   94  


AD, а сам файл каких размеров?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 26.2.2010, 13:27
Сообщение #10


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

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

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 26.2.2010, 13:11) *
AD, а сам файл каких размеров?

Litkevich Yuriy, я его ведь формирую как раз в этих строчках! :) Да разного размера он может быть.

Вопрос к тем, кто хорошо знаком с boost, у меня дескриптор файла библиотеки определен как
boost::shared_ptr<QFile> _writeHandle;
. В указанных функциях используется обычный указатель. Я его получаю с помощью следующего вызова:
<функция>(_writeHandle.get());
Из-за этого не могут быть проблемы с открытием, закрытие файла и перемещением по нему?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 14.12.2018, 10:15