Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > FileSeek возвращает большое отрицательное число


Автор: Zakhar_Shan 11.12.2012, 14:08
Есть процедура по открытию бинарника
Код

    fileHandle=FileOpen(fileName,fileOpenMode);
    fileLength =FileSeek(fileHandle,0,2);


Задача FileSeek, узнать размер файлика. Приложение уже давно работает без отказов. Но попался файлик, FileSeek возвращает мега большое отрицательное число. В Help'e написано
Цитата

If FileSeek is successful, it returns the new position of the file pointer; otherwise, it returns -1. 

т.е. в случае неудачи возврат -1. Но он мне возвращает явно не -1.
Тем более не пойму, в чем причина ошибки именно в этом файле...

Автор: shuttle 11.12.2012, 14:25
Цитата

Есть процедура по открытию бинарника
Код

fileHandle=FileOpen(fileName,fileOpenMode);
fileLength =FileSeek(fileHandle,0,2);


fileLength - какого типа? сделай unsigned.

Автор: Zakhar_Shan 11.12.2012, 14:43
Цитата(shuttle @ 11.12.2012,  14:25)
Цитата

Есть процедура по открытию бинарника
Код

fileHandle=FileOpen(fileName,fileOpenMode);
fileLength =FileSeek(fileHandle,0,2);


fileLength - какого типа? сделай unsigned.

__int64  fileLength ... 
А в мануале:
Цитата

int FileSeek(int Handle, int Offset, int Origin);
Int64 FileSeek(int Handle, Int64 Offsetconst, int Origin);

Автор: math64 11.12.2012, 15:34
Цитата(shuttle @  11.12.2012,  14:25 Найти цитируемый пост)
fileLength - какого типа? сделай unsigned. 

файл может быть длиной терабайт, но никак не экзабайт, таких больших винтов ещё нет.
Но был случай, когда из-за сбоя Винда выдавала свободное место в экзабайтах.

Автор: Zakhar_Shan 11.12.2012, 15:40
Цитата(math64 @ 11.12.2012,  15:34)
Цитата(shuttle @  11.12.2012,  14:25 Найти цитируемый пост)
fileLength - какого типа? сделай unsigned. 

файл может быть длиной терабайт, но никак не экзабайт, таких больших винтов ещё нет.
Но был случай, когда из-за сбоя Винда выдавала свободное место в экзабайтах.

Файл то размером 2.2 Гб всего....:(

Автор: volatile 11.12.2012, 19:17
Zakhar_Shan, если внимательно почитать, то что вы сами запостили:
Цитата(Zakhar_Shan @  11.12.2012,  14:08 Найти цитируемый пост)
fileLength =FileSeek(fileHandle,0,2);

Цитата(Zakhar_Shan @  11.12.2012,  14:43 Найти цитируемый пост)
А в мануале:
Цитата
int FileSeek(int Handle, int Offset, int Origin);
Int64 FileSeek(int Handle, Int64 Offsetconst, int Origin);

то проблема, и ее решение будут очевидны.

нужно ли мне продолжать, или сами уже догадались?

Добавлено через 5 минут и 33 секунды

Впрочем, ладно. учитывая что в соседней теме, вы признались

Цитата(Zakhar_Shan @  11.12.2012,  06:43 Найти цитируемый пост)
Ну, я типо любитель, укажите путь, 

не стану вас мучить

Цитата(Zakhar_Shan @  11.12.2012,  14:08 Найти цитируемый пост)
fileLength =FileSeek(fileHandle,0LL,2);


Автор: Zakhar_Shan 11.12.2012, 19:28
 smile  опа.... даже так...

Автор: volatile 11.12.2012, 19:45
Цитата(Zakhar_Shan @  11.12.2012,  19:28 Найти цитируемый пост)
 smile  опа.... даже так... 

Не понимаю зачем такие большие глаз делать? ведь очевидно что у вас вызывается 32-разрядная функция ФайлСик
А нужно вызвать перегруженную 64-разрядную

На всякий случай, если в вашем компиляторе не поддерживаюся суффикс 'LL' для цифровых литералов, можно непосредствеено привести Offset к 64 разрядному целому:
Цитата(Zakhar_Shan @  11.12.2012,  14:08 Найти цитируемый пост)
fileLength =FileSeek(fileHandle, (Int64)0, 2);


Автор: Zakhar_Shan 12.12.2012, 08:25
Цитата(volatile @ 11.12.2012,  19:45)
Цитата(Zakhar_Shan @  11.12.2012,  19:28 Найти цитируемый пост)
 smile  опа.... даже так... 

Не понимаю зачем такие большие глаз делать? ведь очевидно что у вас вызывается 32-разрядная функция ФайлСик
А нужно вызвать перегруженную 64-разрядную

На всякий случай, если в вашем компиляторе не поддерживаюся суффикс 'LL' для цифровых литералов, можно непосредствеено привести Offset к 64 разрядному целому:
Цитата(Zakhar_Shan @  11.12.2012,  14:08 Найти цитируемый пост)
fileLength =FileSeek(fileHandle, (Int64)0, 2);

Просто я особой литературы не читал, так все для начинающих, и честно говоря от корки до корки, но о таком первый раз слышу... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)