@z0ddak
Мордор напоминает о себе

Как сохранить в памяти и суммировать в число определенную в байтах массу файлов а затем использовать результат?

Доброго времени.
Есть кусок кода, который выполняется в цикле перебора файлов и определяет вес в байтах каждого файла.

void mass(char filePath[]) {

	fstream file(filePath, ios::in | ios::out | ios::binary);
	
	if (!file) {
		return;
	}
	
	file.seekg(0, ios::end);
	unsigned fileSize = file.tellg();
	file.seekg(ios::beg);
	file.close();
	
	// тут как то нужно записывать в память значение fileSize и суммировать все значения, 
        // обновляя итоговый результат в памяти
}

.
.
.

void endSumm() {

	std::string buf;
	string summ_mass = ""; // тут как то получить результат общего веса файлов из памяти, 
                                              // преобразовать в строку
	return summ_mass;
}


Как сохранить в памяти и суммировать в число определенную в байтах массу файлов а затем использовать результат? Я только начал осваивать C++ и нужна ваша профессиональная помощь.
Спасибо!
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
https://en.cppreference.com/w/cpp/filesystem
Если доступен С++17
#include<iostream>
#include<filesystem>
#include<string>
using namespace std;
namespace fs = filesystem;

auto getDirectorySize(const fs::path& p)
{
  uintmax_t size = 0;
  if(fs::is_directory(p))
  {
    for(const auto& f : fs::directory_iterator(p))
    {
      size += f.file_size();
    }
  }
  return size;
}

int main()
{
  string directory{ "C:\\TEMP" };
  fs::path dp{ directory };
  
  auto size{ getDirectorySize(dp) };
  cout << "size of "  << directory 
       << " "         << size 
       << " bytes"    << endl;
}

Или

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;

size_t getFileSize(const string& filename)
{
  ifstream ifs(filename);
  size_t size = 0;
  if(ifs)
  {
    ifs.seekg(0, ios_base::end);
    size = ifs.tellg();
  }
  return size;
}

int main()
{
  vector<string> filenames{
    "C:\\TEMP\\aaa.txt", "C:\\TEMP\\bbb.txt", "C:\\TEMP\\ccc.txt"
  };

  size_t size = 0;

  for(const string& fn : filenames)
  {
    size += getFileSize(fn);
  }

  cout << "Size: " << size << endl;
}

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Из mass() возвращайте размер файла. Там где вызываете mass() суммируйте возвращенное значение.
unsigned mass(char filePath[]) {
   ...
  return fileSize;
}
...
unsigned sum_mass = 0;
sum_mass += mass("file1.txt");
sum_mass += mass("file2.txt");


Если сделать sum_mass глобальной, то она будет видна из всех функций данной единицы трансляции. И можно ее присваивать непосредственно в mass() и возвращать в endSumm(). Кстати endSumm() у вас не правильно объявлена.
Но я бы не советовал использовать глобальные переменные - плохая практика.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы