2016-10-11 2 views
0

В настоящее время я работаю с std::fstream и имеет следующий класс: (Обратите внимание, что файл открывается на конструкторе и должен оставаться открытым во время всех операций чтения/записи, только закрыть при разрушении).Напишите уже открытому файловому потоку и избавьтесь от остальных

MyFileClass 
{ 
public: 
    MyFileClass(const std::string& file_name) { m_file.open(file_name) }; 
    ~MyFileClass() { m_file.close() }; 
    bool read(std::string& content); 
    bool write(std::string& data); 
private: 
    std::fstream m_file; 
} 

Теперь у меня есть некоторые примеры кода:

MyFileClass sample_file; 
sample_file.write("123456"); 
sample_file.write("abc"); 

Результат будет «abc456», потому что, когда поток открыт, и мы пишем с режимом усечения он всегда будет писать на вершине, что в настоящее там.

То, что я хотел бы иметь, это очищать каждый раз, прежде чем писать, поэтому в конце у меня будет только то, что в нем самое новое, в данном случае «abc».

И текущий дизайн, если файл не существует, он будет создан только при записи, но не в read (read вернет код ошибки, если файл отсутствует).

Моя функция записи является:

bool 
MyFileClass::write(const std::string& data) 
{ 
    m_file.seekg(0); 
    if (!m_file.fail()) 
    { 
     m_file << data << std::flush; 
    } 

    return m_file.fail() ? true : false; 
} 

Есть ли способ, чтобы очистить текущее содержимое файла перед промывкой данных?

+1

C++ не обеспечивает способ обрезания уже открытого файла. См. Http://stackoverflow.com/questions/20809113/how-to-truncate-a-file-while-it-is-open-with-fstream – Barmar

+0

За исключением повторного открытия файла, нет. – UKMonkey

ответ

0

, чтобы иметь возможность записывать в конец файла использовать флаг ios :: app.

код полна ошибок:

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

2- функции записи и чтения, определенные для ссылки на строку, но вы передаете по значению! (прохождение «12345» и «abc»)

3- Почему вы ищете указатель ввода? (Seekg)? до тех пор, пока вы пытаетесь написать ?? !! Вы можете означать seekp() поиск указателя выхода; даже в этом случае по какой причине это сделать? если вы хотите добавить текст в конец, используйте ios :: app в открывшемся файле. , если вы хотите очистить содержимое при любой операции записи, тогда у вас должно быть два потока файлов, один для чтения, а другой для записи, так что для записи используется флаг ios :: out | ИОС :: TRUNC. потому что ios :: trunc ничего не делает в режиме чтения/записи.

4 Если вы действительно хотите передать по ссылке, тогда вы должны объявить строковые объекты в главной передаче им значений («abc» и «12345» для каждого), а затем передать эти строки для записи и чтения значений.

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

class MyFileClass 
{ 
public: 
    MyFileClass( std::string file_name); 
    ~MyFileClass() { m_file.close(); } 
    bool read (std::string content); 
    bool write(std::string data); 
private: 
    std::fstream m_file; 
}; 

MyFileClass::MyFileClass(std::string file_name) 
{ 
    m_file.open(file_name.c_str(), ios::out | ios::in | ios::app); 
    if(!m_file) 
     cout << "Failed to open file!" << endl; 
} 

bool MyFileClass::write(const std::string data) 
{ 
    if (!m_file.fail()) 
    { 
     m_file << data.c_str() << std::flush; 
    } 

    return m_file.fail() ? true : false; 
} 

int main() 
{ 

    std::string sFile = "data.dat"; 

    MyFileClass sample_file(sFile); 

    sample_file.write("123456"); 
    sample_file.write("abc"); 

    return 0; 
} 
+0

Привет, спасибо за ваш комментарий. Это была моя ошибка со всеми состязаниями и материалами, но это всего лишь небольшая выборка и вообще не связанная с основным вопросом. – mappa

+0

Несчастный случай попал. Ответ коротким я получил, я не могу усечь и уже открыть файл. Предложение с двумя потоками не является вариантом ( – mappa

+0

Снова .... Хорошо, так что ваша точка 1,2,4 - это все мои ошибки, и это не то, что я хочу спросить (просто пример, чтобы продемонстрировать идею, код не нужен запускать или компилировать). Point 3- У меня есть 1 файл, который уже открыт, и он останется открытым, это требование. Другой поток или открыть его снова для переназначения нового режима - это не вариант.Ссылки Barmar достаточно хорошо описывали проблему и ограничение тока. – mappa