Ifstream.read() ничего не читает?

У меня возникли проблемы с чтением файлов в моем проекте, поэтому я написал следующие тестовые коды.

Я пытаюсь прочитать файл от 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 

Потоки буферизуются, поэтому вы, вероятно, пытаетесь прочитать данные до того, как они будут фактически записаны в файл.

BoP 22.05.2023 11:25

Зачем все это в стиле "С" char arr[8] = {0}; const int length = sizeof arr / sizeof arr[0];. Используйте std::array или std::vector

Pepijn Kramer 22.05.2023 11:25

какой другой результат вы ожидали и почему? std::ofstream моделирует поток, а не сам файл. Вызов ofs.write на самом деле не то же самое, что "записать в файл"

463035818_is_not_a_number 22.05.2023 11:29
sizeof content не имеет ничего общего с длиной данных, он указывает только на размер указателя.
Retired Ninja 22.05.2023 11:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это связано с тем, что данные не записываются на диск. После вызова 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();                                     

Другие вопросы по теме