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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 65, средняя оценка - 4.71
Vasiliusis
41 / 41 / 2
Регистрация: 14.10.2008
Сообщений: 131
#1

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

17.04.2009, 10:14. Просмотров 8751. Ответов 18
Метки нет (Все метки)

Для того, кто не знает как получить размер файла, и того, кто не хочет пользоваться 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++):

Очистка/удаление файла *.txt с помощью fstream - C++
Как с помощью#include &lt;fstream&gt; очистить/удалить файл по заданному пути?

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

Можно ли с помощью fstream создать папку - C++
Можно ли с помощью fstream создать папку с каким-то файлом? Заранее спасибо

Как записать структуру в файл с помощью fstream? - C++
доброго времени суток, нужна ваша помощ. припустим у нас есть структура: struct group { char name; int k; }st; как...

fstream, создание файла - C++
Привет всем, не могу справиться с проблемой. fstream file(FILE,ios::in|ios::out|ios::binary); файл не создается, но если создать...

Fstream - чтение из файла - C++
подскажите начинающему программисту как читать файл целиком.. например последовательность чисел

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
radiohobbyt
192 / 190 / 5
Регистрация: 27.01.2009
Сообщений: 548
17.04.2009, 15:38 #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
41 / 41 / 2
Регистрация: 14.10.2008
Сообщений: 131
17.04.2009, 17:56  [ТС] #3
И зачем так много писать?

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

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

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

Не, адрес объекта один. А начало и конец - это не указатели, а кластеры на нашем харде - это уже другая история
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.04.2009, 21:35 #8
Да нет же=))) объявить указатель на файл,так можно?Ну после открытия,что-ли...Или файл сам по себе не может быть объектом в памяти??А потом этот указатель ++ и разница (p1-p) будет некой областью памяти с размером,правильно?или я не догоняю тему ))
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
12.10.2011, 05:25 #9
да блин! это не верный способ! Для некоторых файлов и старых стандартов это приведёт к ошибкам в ихмерениях размера файла. Nikolai M. Josuttis в своей книжке про стандартную библиотеку объясняет что такой вариант не годен так как, скажем, символ перехода на другую строку часто записывается в 2 байта. Я сегодня работаю с файлом в 98 тысяч строк, и такая ошибка ощутима. Именно из-за трудности написания универсального алгоритма получение размера таким образом не реализовано вовсе.
Функции tellg() и tellp() возвращают абсолютную позицию в виде значения типа pos_type. Это значение не является целым числом или индексом, задающим позицию символа, поскольку логическая позиция может отличатся от фактической. Например, в текстовых файлах MS-DOS символы новой строки хранятся в файлах в виде двух символов, хотя логически они соответствуют только оному символу. Кроме того, ситуация дополнительно усложняется при многобайтовой кодировке символов.
Добавлено через 1 час 16 минут
вернее, это не размер строки в файле а размер самого файла. Если нужен размер строки нужно суметь открыть файл с параметром std::ios::binary. У меня, лично, не вышло. После пяти часов копания плюнул и написал через <cstdio>
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
12.10.2011, 08:30 #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
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
12.10.2011, 08:55 #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 #12
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
И что именно не вышло?
Писал что-то вроде
C++
1
std::fstream fp("D:\\config.ini", std::fstream::in | std::fstream::binary);
после чего создавался fp который был неторт и приведении к bool возвращал false. На операционку грешить глупо, ибо с FILE* всё сработало.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
12.10.2011, 10:32 #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
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
12.10.2011, 10:36 #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
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
12.10.2011, 11:00 #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, потому что в двоичном потоке может быть заполнение неопределённым количеством нуль-символов в конце
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2011, 11:00
Привет! Вот еще темы с ответами:

Запись в середину файла - fstream - C++
Как можно при помощи fstream (хотелось бы именно им, потому что он умеет и читать, и писать) записать что-либо в середину файла (или куда...

Чтение всего файла fstream - C++
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа...

Заменить чтение из файла аналогом fstream - C++
char fileName; printf(&quot;Enter file name: &quot;); scanf(&quot;%255s&quot;, fileName); FILE *open = fopen(fileName, &quot;r&quot;); ...

Определение длины файла для fstream - C++
fseek(input, 0, SEEK_END); //указываем позицыю unsigned long SizeOfIshod = ftell(input);//создаем переменную которая будет возвращать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2011, 11:00
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru