не работает seekg

102
16 января 2022, 23:00

Нужно пройтись по файлу 2 раза, чтоб узнать его размер, а потом прочитать. Проблема в том, что seekg(0) не сбрасывает указатель на элемент файла функции get и во втором цикле она сразу возвращает false. как это исправить?

int main()
{
    fstream file("/home/anton/Загрузки/Сайт/content/nodemcu.jpg");
    std::string buffer;
    char current;
    int size;
    while(file.get(current))
    {
        size++;
    }
    file.seekg(0);
    while (file.get(current))
    {
        buffer.push_back(current);
    }
    cout << buffer.length();
    file.close();
}
Answer 1

Вместо чтения файла до упора (что выставит флажок eof) открывайте файл в бинарном режиме отмотанным в конец и получайте размер:

::std::ifstream file{"/home/anton/Загрузки/Сайт/content/nodemcu.jpg", ::std::ifstream::ate bitor ::std::ifstream::binary};
auto const size{file.tellg()};
file.seekg(0);
Answer 2

Если Вам нужен размер файла в stl из boost перекочевала filesystem

#include <iostream>
#include <filesystem>
#include <cstdint>
#include <stdio.h>

int main() {
    auto path{ std::filesystem::current_path() / "data" };
    try {
        if (!std::filesystem::exists(path)) {
            throw std::runtime_error{ "Error : file not found" };
        } else {
            std::uintmax_t size{ std::filesystem::file_size("data") };
            std::cout << "Size : " << size << std::endl;
        }
    } catch (std::filesystem::filesystem_error & e) {
        std::cout << e.what() << '\n';
    }
    // Старый стиль
    FILE* f;
    auto f_r = fopen("data", "r");
    fseek(f_r, 0L, SEEK_END);
    auto c_size = ftell(f_r);
    std::cout << "File size : " << c_size << std::endl;
    fseek(f_r, 0L, SEEK_SET);
    return 0;
}
READ ALSO
(C++) Разделить строку на несколько слов

(C++) Разделить строку на несколько слов

Как возможно реализовать разделение строки без использования стандартных библиотек C++?

91
с++: прекратить выполнение всех потоков

с++: прекратить выполнение всех потоков

Формирую задачу, которая будет выполняться в нескольких потоках с помощью stl следующим образом:

99
Проблема обработки строк в с++

Проблема обработки строк в с++

Есть задание на написание программы, которая обрабатывает текстовый файл со строками такого вида:

99
Несколько auto в объявлении функции

Несколько auto в объявлении функции

Можно объявить функцию так, чтобы узнать возвращаемый тип по типу возвращаемого выражения:

151