Информация об изменениях

Сообщение Re[5]: Как в одну строку кода прочитать содержимое файла в м от 05.01.2024 22:24

Изменено 05.01.2024 22:24 rg45

Re[5]: Как в одну строку кода прочитать содержимое файла в м
Здравствуйте, ·, Вы писали:

R>>·>Как я понял, в случае если файл обрежется конкурентно, то в хвосте массива будут нули. Happy debugging.

R>>·>По уму надо ещё читать gcount и обрезать.
R>>·>В общем, если писать надёжное, работающее решение во всяких экзотических случаях, то хитро всё становится, в две строчки не уложишься.

Хотя, этf проблема закрывается ценой еще одного усложнения, всего в одну строчку, но функция по-прежнему выглядит достаточно простой:

std::vector<uint8_t> read_all_bytes(const std::string& path)
{
   std::basic_ifstream<uint8_t> input(path.c_str(), std::ios_base::binary | std::ios_base::ate);
   std::vector<uint8_t> bytes(input.tellg());
   input.seekg(0);
   input.read(bytes.data(), bytes.size());
   return bytes;
}


·>Именно. Поэтому я считаю, что это вполне возможно и достаточно оправдано сделать универсальное и надёжное решение в стандартной библиотеке. Т.к. частное решение в две строчки может иметь очень тонкие баги.


Ну, не знаю, как по мне, то борьбу эффективности и универсальности никто не отменял и никогда не отменит. Всегда возникали и будут возникать ситуации, когда частное решение будет более предпочтительным, чем общее универсальное. Очень часто стремление получить общее универсальное решение приводит к созданию ужасных монстров. Взять ту же File.ReadAllBytes — вы уверены, что в ней учтены все возможные нюансы на все случаи жизни? Я ничего не утверждаю, я интересуюсь. Что если окажется, что эта функция работает плохо или вообще не работает при каких-то экзотических условиях и не удовлетворяет каким-то очень редким требованиям? Программист C++ в этом случает сядет и напишет-таки то, что ему будет нужно, а что будет делать программист C#?
Re[5]: Как в одну строку кода прочитать содержимое файла в м
Здравствуйте, ·, Вы писали:

R>>·>Как я понял, в случае если файл обрежется конкурентно, то в хвосте массива будут нули. Happy debugging.

R>>·>По уму надо ещё читать gcount и обрезать.
R>>·>В общем, если писать надёжное, работающее решение во всяких экзотических случаях, то хитро всё становится, в две строчки не уложишься.

Хотя, эта проблема закрывается ценой еще одного усложнения, всего в одну строчку, но функция по-прежнему выглядит достаточно простой:

std::vector<uint8_t> read_all_bytes(const std::string& path)
{
   std::basic_ifstream<uint8_t> input(path.c_str(), std::ios_base::binary | std::ios_base::ate);
   std::vector<uint8_t> bytes(input.tellg());
   input.seekg(0);
   input.read(bytes.data(), bytes.size());
   return bytes;
}


·>Именно. Поэтому я считаю, что это вполне возможно и достаточно оправдано сделать универсальное и надёжное решение в стандартной библиотеке. Т.к. частное решение в две строчки может иметь очень тонкие баги.


Ну, не знаю, как по мне, то борьбу эффективности и универсальности никто не отменял и никогда не отменит. Всегда возникали и будут возникать ситуации, когда частное решение будет более предпочтительным, чем общее универсальное. Очень часто стремление получить общее универсальное решение приводит к созданию ужасных монстров. Взять ту же File.ReadAllBytes — вы уверены, что в ней учтены все возможные нюансы на все случаи жизни? Я ничего не утверждаю, я интересуюсь. Что если окажется, что эта функция работает плохо или вообще не работает при каких-то экзотических условиях и не удовлетворяет каким-то очень редким требованиям? Программист C++ в этом случает сядет и напишет-таки то, что ему будет нужно, а что будет делать программист C#?