singlepost

[С++] длина файла << На главную или назад  

есть шаблонный класс, наследник 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.
я жутко туплю и не могу понять почему.
везде где смотрел, используют подобный подход.
может кто-нибудь подсказать в чем ошибка? %)

16 ответов в теме “[С++] длина файла”

  1. 16
    Павел Акулов ответил:

    Я делал так:

    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 );

    Проверено, работает.

  2. 15
    Леонид Максимов ответил:

    я к тому, что код с виду рабочий. вот и товарищи то же самое утверждают. может у вас поток выставил fail-бит или еще какую пакость?

  3. 14
    Артём Малаховский ответил:

    хм..надо проверить.. что-то заработался.
    спасибо

  4. 13
    Артём Малаховский ответил:

    странно…
    лан, попробую разобраться дальше

  5. 12
    Артем Карпенко ответил:

    хм, вот повторил ваш код, работает:

    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;
    }

  6. 11
    Евгений Гаврин ответил:

    #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;
    }

  7. 10
    Леонид Максимов ответил:

    а проверку состояния потока слабо добавить?

  8. 9
    Артём Малаховский ответил:

    в смысле? можно немного подробней?

  9. 8
    Артём Малаховский ответил:

    #8, это красиво, но на C и никак не привязать в метод класса.

  10. 7
    Евгений Гаврин ответил:

    #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;
    }

  11. 6
    Вячеслав Поклонов ответил:

    не знаю! я только учусь!

  12. 5
    Vitaly Martynovich ответил:

    :D DDDDDD

  13. 4
    Артём Малаховский ответил:

    а причем это тут? о_О
    я даже не в вмжуале пишу

  14. 3
    Вячеслав Поклонов ответил:

    ну ошипка где то в return!

  15. 2
    Артём Малаховский ответил:

    О_о и где?

  16. 1
    Вячеслав Поклонов ответил:

    В вижуале с++, меняем начальные строки с int main на void main и убераем return, помоему так!

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.