Форум программистов, компьютерный форум CyberForum.ru

Получение размера файла с помощью fstream. ОТВЕТ. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 65, средняя оценка - 4.71
Vasiliusis
37 / 37 / 0
Регистрация: 14.10.2008
Сообщений: 127
17.04.2009, 10:14     Получение размера файла с помощью fstream. ОТВЕТ. #1
Для того, кто не знает как получить размер файла, и того, кто не хочет пользоваться API или не умеет: ВОТ ПОЛУЧЕНИЕ РАЗМЕРА:

Код
fstream file("tratata.txt", [B]ios::in|ios::ate[/B]);

cout<<file.tellg();//ВОТ РАЗМЕР ФАЙЛА
Может быть коряво, но работает и понятно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2009, 10:14     Получение размера файла с помощью fstream. ОТВЕТ.
Посмотрите здесь:

C++ fstream, создание файла
C++ Ввод имени входного/выходного файла с клавиатуры (fstream)
fstream очистка/удаление файла *.txt C++
Заменить чтение из файла аналогом fstream C++
Запись в середину файла - fstream C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
radiohobbyt
 Аватар для radiohobbyt
192 / 190 / 4
Регистрация: 27.01.2009
Сообщений: 548
17.04.2009, 15:38     Получение размера файла с помощью fstream. ОТВЕТ. #2
для тех, кто не знает fstream...коряво, но работает
C
1
2
HANDLE hLogFile=CreateFile("tmp.tmp", GENERIC_READ|GENERIC_WRITE    , NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
unsigned int uiFilesize=GetFileSize(hLogFile, NULL);
Vasiliusis
37 / 37 / 0
Регистрация: 14.10.2008
Сообщений: 127
17.04.2009, 17:56  [ТС]     Получение размера файла с помощью fstream. ОТВЕТ. #3
И зачем так много писать?

Цитата Сообщение от radiohobbyt Посмотреть сообщение
для тех, кто не знает fstream...коряво, но работает
Остроумно
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.04.2009, 18:18     Получение размера файла с помощью fstream. ОТВЕТ. #4
Vasiliusis, а почему коряво?Это же из стандартной библиотеки,да?Тогда даже лучше.А можно реализовать через указатели?
Vasiliusis
37 / 37 / 0
Регистрация: 14.10.2008
Сообщений: 127
17.04.2009, 18:38  [ТС]     Получение размера файла с помощью fstream. ОТВЕТ. #5
Цитата Сообщение от #pragma Посмотреть сообщение
Vasiliusis, а почему коряво?Это же из стандартной библиотеки,да?Тогда даже лучше.А можно реализовать через указатели?
Через указатели, всмысле fstream* file = new fstream("tratata.txt", ios::in|ios::ate), или как?

А коряво я имел ввиду, что это так - смекалка, выход из положения, а не использование специально предназначеной для получения размера функции, наподобии там file.filesize() или что-то в этом роде
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.04.2009, 18:43     Получение размера файла с помощью fstream. ОТВЕТ. #6
Цитата Сообщение от Vasiliusis Посмотреть сообщение
Через указатели, всмысле fstream* file = new fstream("tratata.txt", ios::in|ios::ate), или как?

А коряво я имел ввиду, что это так - смекалка, выход из положения, а не использование специально предназначеной для получения размера функции, наподобии там file.filesize() или что-то в этом роде
Я имел ввиду что у каждого файла при обращении есть какое-то начало и конец,это же некий объект,правильно?Я имел ввиду разницу указателей.
Vasiliusis
37 / 37 / 0
Регистрация: 14.10.2008
Сообщений: 127
17.04.2009, 20:41  [ТС]     Получение размера файла с помощью fstream. ОТВЕТ. #7
Т.е. для каждой буквы свой указатель, и у начала и конца разница равна числу букав - НУ тогда адресного пространства программы не хватит)))) Вы что, нет конечно

Не, адрес объекта один. А начало и конец - это не указатели, а кластеры на нашем харде - это уже другая история
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.04.2009, 21:35     Получение размера файла с помощью fstream. ОТВЕТ. #8
Да нет же=))) объявить указатель на файл,так можно?Ну после открытия,что-ли...Или файл сам по себе не может быть объектом в памяти??А потом этот указатель ++ и разница (p1-p) будет некой областью памяти с размером,правильно?или я не догоняю тему ))
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
12.10.2011, 05:25     Получение размера файла с помощью fstream. ОТВЕТ. #9
да блин! это не верный способ! Для некоторых файлов и старых стандартов это приведёт к ошибкам в ихмерениях размера файла. Nikolai M. Josuttis в своей книжке про стандартную библиотеку объясняет что такой вариант не годен так как, скажем, символ перехода на другую строку часто записывается в 2 байта. Я сегодня работаю с файлом в 98 тысяч строк, и такая ошибка ощутима. Именно из-за трудности написания универсального алгоритма получение размера таким образом не реализовано вовсе.
Функции tellg() и tellp() возвращают абсолютную позицию в виде значения типа pos_type. Это значение не является целым числом или индексом, задающим позицию символа, поскольку логическая позиция может отличатся от фактической. Например, в текстовых файлах MS-DOS символы новой строки хранятся в файлах в виде двух символов, хотя логически они соответствуют только оному символу. Кроме того, ситуация дополнительно усложняется при многобайтовой кодировке символов.
Добавлено через 1 час 16 минут
вернее, это не размер строки в файле а размер самого файла. Если нужен размер строки нужно суметь открыть файл с параметром std::ios::binary. У меня, лично, не вышло. После пяти часов копания плюнул и написал через <cstdio>
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
12.10.2011, 08:30     Получение размера файла с помощью fstream. ОТВЕТ. #10
Цитата Сообщение от radiohobbyt Посмотреть сообщение
HANDLE hLogFile=CreateFile("tmp.tmp", GENERIC_READ|GENERIC_WRITE , NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);
unsigned int uiFilesize=GetFileSize(hLogFile, NULL);
radiohobbyt, а если значение будет 64-битным так часто случается в таком случае нужно через параметр получать размер файла с проверкой, это только для windows.
Вот получение размер файла объектом-fstream
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
 
int  main(void) {
  std::fstream fp("D:\\config.ini", std::fstream::in);
  fp.seekp(0, std::ios::end);
  long size = fp.tellp();
  // если предпологается дальнейшея работа с файлом, переместить ф-указатель в начало
 // fp.seekp(0, std::ios::beg); 
   fp.close();
   std::cout << "size file: " << size << '\n';
   std::cin.get();
   return 0;
}
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
12.10.2011, 08:55     Получение размера файла с помощью fstream. ОТВЕТ. #11
Цитата Сообщение от CEBEP Посмотреть сообщение
да блин! это не верный способ! Для некоторых файлов и старых стандартов это приведёт к ошибкам в ихмерениях размера файла. Nikolai M. Josuttis в своей книжке про стандартную библиотеку объясняет что такой вариант не годен так как, скажем, символ перехода на другую строку часто записывается в 2 байта. Я сегодня работаю с файлом в 98 тысяч строк, и такая ошибка ощутима. Именно из-за трудности написания универсального алгоритма получение размера таким образом не реализовано вовсе.


Добавлено через 1 час 16 минут
вернее, это не размер строки в файле а размер самого файла. Если нужен размер строки нужно суметь открыть файл с параметром std::ios::binary. У меня, лично, не вышло. После пяти часов копания плюнул и написал через <cstdio>
И что именно не вышло?
Просто интересно.
Посмотри в моей книжке - все работает и работает правильно.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
12.10.2011, 10:14     Получение размера файла с помощью fstream. ОТВЕТ. #12
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
И что именно не вышло?
Писал что-то вроде
C++
1
std::fstream fp("D:\\config.ini", std::fstream::in | std::fstream::binary);
после чего создавался fp который был неторт и приведении к bool возвращал false. На операционку грешить глупо, ибо с FILE* всё сработало.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.10.2011, 10:32     Получение размера файла с помощью fstream. ОТВЕТ. #13
C++
1
2
boost::filesystem::path path(std::string("/usr/include/boost/filesystem.hpp"));
std::cout << boost::filesystem::file_size(path) << std::endl;
Добавлено через 1 минуту
http://liveworkspace.org/code/c33c13...a516050260b317
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
12.10.2011, 10:36     Получение размера файла с помощью fstream. ОТВЕТ. #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <fstream>
#include <iostream>
 
int main(int argc, char **argv) {
    std::ifstream ifs(argv[1]);
    
    ifs.seekg(0, std::ios_base::end);
    int size = ifs.tellg();
 
    std::cout << size << " bytes" << std::endl;
    return 0;
}
Код
fasked@nexus:/tmp/src$ g++ fs.cpp
fasked@nexus:/tmp/src$ ls
a.out  fm.c  fs.cpp
fasked@nexus:/tmp/src$ ./a.out fs.cpp
224 bytes
fasked@nexus:/tmp/src$ ./a.out fm.c
426 bytes
fasked@nexus:/tmp/src$ ls -l
total 20
-rwxr-xr-x 1 fasked fasked 8320 2011-10-12 10:35 a.out
-rw-r--r-- 1 fasked fasked  426 2011-10-11 11:14 fm.c
-rw-r--r-- 1 fasked fasked  224 2011-10-12 10:35 fs.cpp
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.10.2011, 11:00     Получение размера файла с помощью fstream. ОТВЕТ. #15
Цитата Сообщение от xAtom
C++
1
2
3
  std::fstream fp("D:\\config.ini", std::fstream::in);
  fp.seekp(0, std::ios::end);
  long size = fp.tellp();
Цитата Сообщение от fasked
C++
1
int size = ifs.tellg();
что возвращает .tellg() или .tellp() для текстового потока ?

в C аналогичную операцию через ftell() нельзя выполнять, потому что она используется для текстовых потоков, чтобы получать значение индикатора файловой позиции для последующего использования в вызове fseek()
она не возвращает количество символов в текстовом потоке
а для бинарных нельзя применять fseek() с SEEK_END, потому что в двоичном потоке может быть заполнение неопределённым количеством нуль-символов в конце
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
12.10.2011, 11:36     Получение размера файла с помощью fstream. ОТВЕТ. #16
accept, у меня и для бинарных файлов все отлично. На Linux разницы никакой вроде и нет.
Цитата Сообщение от accept Посмотреть сообщение
что возвращает .tellg() или .tellp() для текстового потока ?
stream position разве не должен свободно преобразовываться в int?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2011, 02:10     Получение размера файла с помощью fstream. ОТВЕТ. #17
а что это за число streampos ? чему оно равно ?

для файла с "\r\n\r\n" в уиндоус в текстовом режиме что вернёт .tellg() ?

Цитата Сообщение от fasked
На Linux разницы никакой вроде и нет.
ftell() с SEEK_END нельзя применять для двоичных потоков
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.10.2011, 02:33     Получение размера файла с помощью fstream. ОТВЕТ. #18
Цитата Сообщение от accept Посмотреть сообщение
для файла с "\r\n\r\n" в уиндоус в текстовом режиме что вернёт .tellg() ?
-1

Цитата Сообщение от accept Посмотреть сообщение
ftell() с SEEK_END нельзя применять для двоичных потоков
альтернатива?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 02:52     Получение размера файла с помощью fstream. ОТВЕТ.
Еще ссылки по теме:

C++ Чтение всего файла fstream
Fstream - чтение из файла C++
Как поэлементно считать текст с файла с помощью fstream, и сохранить каждый символ в массив? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2011, 02:52     Получение размера файла с помощью fstream. ОТВЕТ. #19
Цитата Сообщение от Jupiter
альтернатива?
можно читать символы, пока не встретился конец файла
также там можно применять offset от SEEK_SET и SEEK_CUR
Yandex
Объявления
13.10.2011, 02:52     Получение размера файла с помощью fstream. ОТВЕТ.
Ответ Создать тему
Опции темы

Текущее время: 02:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru