Нужно пройтись по файлу 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();
}
Вместо чтения файла до упора (что выставит флажок eof) открывайте файл в бинарном режиме отмотанным в конец и получайте размер:
::std::ifstream file{"/home/anton/Загрузки/Сайт/content/nodemcu.jpg", ::std::ifstream::ate bitor ::std::ifstream::binary};
auto const size{file.tellg()};
file.seekg(0);
Если Вам нужен размер файла в 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как возможно реализовать разделение строки без использования стандартных библиотек C++?
Формирую задачу, которая будет выполняться в нескольких потоках с помощью stl следующим образом:
Есть задание на написание программы, которая обрабатывает текстовый файл со строками такого вида:
Можно объявить функцию так, чтобы узнать возвращаемый тип по типу возвращаемого выражения: