Как сохранить, а также прочитать файл c ++ fstream, не закрывая его - PullRequest
0 голосов
/ 18 ноября 2018

Я открыл файл в режиме чтения и записи

, используя следующую инструкцию

file.open(fileName, ios::in | ios::out | ios::trunc);

Моя основная цель открыть файл в обоих режимах - прочитать и записать файл вв то же время.

Но в моем сценарии кода,

, когда я читаю файл после его записи, вывод, показывающий пустое значение, означает, что он не сохраняет мое содержимое записи, потому что я не закрываюit.

И я хочу закрыть файл после завершения записи и чтения операции

Я нашел решение в переполнении стека,

для использования flush () функция для сохранения файла без закрытия

file.flush();

но проблема в том, что он не работает для моего случая

Итак, как я могу сохранить файл c ++ fstream без закрытия?

Вот мой полный код для лучшего понимания

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


int main(int argc, char const *argv[])
{
    string fileName = "text.txt";

    fstream file;


    file.open(fileName, ios::in | ios::out | ios::trunc);

    if (file.is_open())
    {
        file << "I am a Programmer" << endl;
        file << "I love to play" << endl;
        file << "I love to work game and software development" << endl;
        file << "My id is: " << 1510176113 << endl;

        file.flush(); // not working 
    }
    else
    {
        cout << "can not open the file: " << fileName << endl;
    }

    if (file.is_open())
    {
        string line;

        while(file)
        {
            getline(file, line);

            cout << line << endl;
        }
    }
    else
    {
        cout << "can not read file: " << fileName << endl;
    }

    file.close();

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

На самом деле, если вы хотите сохранить какой-либо файл немедленно, не закрывая файл, вы можете просто использовать

file.flush();

Но если вы хотите прочитать файл без закрытия сразу после его записи, вы можете просто использовать

file.seekg(0);

фактически seekg () Функция сбрасывает указатель файла в начале, для этого не обязательно сохранять файл. Итак, это не имеет ничего общего с функцией flush ()

но вы можете сделать оба, если хотите

0 голосов
/ 18 ноября 2018

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

Вам нужно использовать file.seekg(0); где-то после file.flush(), но перед началом чтения, чтобы поместить указатель файла в самое начало.

Обновление

Это должно работать без сброса. Однако это будет зависеть от реализации библиотеки std. Хотя я бы посчитал это ошибкой, если он не работает без вызова flush() imho, не повредит явно вызвать его.

...