есть шаблонный класс, наследник fstream.
вроде как функция определения длины файла.
unsigned int OperTFile<T>::FLen()
{
if(is_open())
{
int k=tellg();
seekg(0, ios::end);
int d=tellg();
seekg(k);
return d;
}
else throw nopfile();
}
дело в том что, какой бы ни был файл, возвращает всегда 0.
я жутко туплю и не могу понять почему.
везде где смотрел, используют подобный подход.
может кто-нибудь подсказать в чем ошибка? %)
10 октября 2009 в 6:05
Я делал так:
fstream f;
f.clear();
f.open("C:\\file.txt", ios::in|ios::ate|ios::binary);
int len=f.tellg();
f.seekg( 0, ios_base::beg );
Проверено, работает.
9 октября 2009 в 0:05
я к тому, что код с виду рабочий. вот и товарищи то же самое утверждают. может у вас поток выставил fail-бит или еще какую пакость?
9 октября 2009 в 0:05
хм..надо проверить.. что-то заработался.
спасибо
9 октября 2009 в 0:03
странно…
лан, попробую разобраться дальше
8 октября 2009 в 23:05
хм, вот повторил ваш код, работает:
template <typename T>
class OperTFile : public std::fstream {
public:
int FLen() {
if (is_open()) {
int k=tellg();
seekg(0, std::ios::end);
int d=tellg();
seekg(k);
return d;
}
else {
return -1;
}
}
};
int main() {
OperTFile<int> of;
of.open("test");
std::cout<<of.FLen()<<std::endl;
of.close();
return 0;
}
8 октября 2009 в 23:02
#include <iostream>
#include <fstream>
using namespace std;
int main () {
int length;
char * buffer;
ifstream is;
is.open ("test.txt", ios::binary );
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
is.read (buffer,length);
is.close();
cout.write (buffer,length);
return 0;
}
8 октября 2009 в 23:01
а проверку состояния потока слабо добавить?
8 октября 2009 в 23:01
в смысле? можно немного подробней?
8 октября 2009 в 22:04
#8, это красиво, но на C и никак не привязать в метод класса.
8 октября 2009 в 22:02
#include <stdio.h>
int main ()
{
FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return 0;
}
8 октября 2009 в 22:01
не знаю! я только учусь!
8 октября 2009 в 22:01
DDDDDD
8 октября 2009 в 22:00
а причем это тут? о_О
я даже не в вмжуале пишу
8 октября 2009 в 22:00
ну ошипка где то в return!
8 октября 2009 в 22:00
О_о и где?
8 октября 2009 в 21:05
В вижуале с++, меняем начальные строки с int main на void main и убераем return, помоему так!