У меня возникли проблемы с чтением файлов в моем проекте, поэтому я написал следующие тестовые коды.
Я пытаюсь прочитать файл от ifstream.read(), но что-то было прочитано.
Я искал множество связанных вопросов, но до сих пор не могу понять, почему мой код не работает. пожалуйста помоги.
#include <iostream>
#include <fstream>
int main() {
/*--------------- write file ----------------*/
std::ofstream ofs("testfile", std::ios::binary);
const char *content = "11223344";
ofs.write(content, sizeof content);
system("chmod 777 testfile");
/*--------------- read file ----------------*/
char arr[8] = {0};
const int length = sizeof arr / sizeof arr[0];
std::ifstream ifs("testfile", std::ios::binary);
std::cout << "good: " << ifs.good() << std::endl; // 1
ifs.seekg(0, ifs.end);
int file_size = ifs.tellg();
ifs.seekg(0, ifs.beg);
std::cout << "file_size: " << file_size << std::endl << std::endl; // 0
if (ifs) {
ifs.read(&arr[0], 2);
std::cout << "after read," << std::endl;
std::cout << "gcount: " << ifs.gcount() << std::endl; // 0
std::cout << "good: " << ifs.good() << std::endl; // 0
ifs.read(&arr[2], 2);
ifs.read(&arr[4], 2);
ifs.read(&arr[6], 2);
} else {
std::cout << "file not found" << std::endl;
}
for (int i = 0; i < length; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
}
Выход
good: 1
file_size: 0
after read,
gcount: 0
good: 0
0 0 0 0 0 0 0 0
Зачем все это в стиле "С" char arr[8] = {0}; const int length = sizeof arr / sizeof arr[0];. Используйте std::array или std::vector
какой другой результат вы ожидали и почему? std::ofstream моделирует поток, а не сам файл. Вызов ofs.write на самом деле не то же самое, что "записать в файл"
sizeof content не имеет ничего общего с длиной данных, он указывает только на размер указателя.





Это связано с тем, что данные не записываются на диск. После вызова ofs.write следует вызвать либо ofs.flush(), либо ofs.close(), чтобы убедиться, что данные записаны на диск перед их чтением.
Кроме того, sizeof content для получения длины строки, начинающейся с адреса, заданного указателем content, работает на 64-битных платформах для этого конкретного случая, когда строка имеет 8 символов, но не будет работать в других случаях. Правильная идиома состоит в том, чтобы объявить массив символов, инициализируя его литеральной строкой, затем sizeof дает размер массива, который содержит завершающий символ nul, поэтому для получения длины строки следует вычесть 1.
Так что начало скорее такое:
/*--------------- write file ----------------*/
std::ofstream ofs("testfile", std::ios::binary);
const char content[] = "11223344";
ofs.write(content, sizeof content - 1);
ofs.close();
Потоки буферизуются, поэтому вы, вероятно, пытаетесь прочитать данные до того, как они будут фактически записаны в файл.