Tôi đang sử dụng một FileManager cho một dự án để đọc và viết ít rắc rối hơn cho tôi. Hoặc sẽ là, nếu tôi không dành tất cả thời gian này gỡ lỗi nó. Vì vậy, lớp học tiện nghi này thực sự đã gây ra cho tôi sự căng thẳng và thời gian. Tuyệt vời.Fstream không tạo được tập tin mới
Sự cố có vẻ là fstream
. Trước khi tiếp tục, đây là cấu trúc của lớp FileManager của tôi.
class FileManager : Utility::Uncopyable
{
public:
FileManager();
void open(std::string const& filename);
void close();
void read(std::string& buffer);
void write(std::string const& data);
private:
std::fstream stream_;
};
Rất đơn giản. Bộ đệm được nạp với dữ liệu trong hàm đọc, tham số dữ liệu là những gì được ghi vào tệp. Trước khi đọc và viết, bạn phải mở tập tin hoặc rủi ro nhận được một ngoại lệ lớn, chất béo trong khuôn mặt của bạn. Loại như tôi đang nhận được bây giờ.
Tình huống: Đăng ký dòng lệnh đơn giản của người dùng, sau đó ghi dữ liệu vào tệp. Tôi yêu cầu tên và mật khẩu. Tên được sao chép và nối với .txt (tên tệp). Vì vậy, có vẻ như sau:
void SessionManager::writeToFile(std::string const& name,
std::string const& password)
{
std::string filename = name + ".txt";
std::string data;
data += name +", " +password;
try
{
fileManager_->open(filename);
fileManager_->write(data);
fileManager_->close();
}
catch(FileException& exception)
{
/* Clean it up. */
std::cerr << exception.what() << "\n";
throw;
}
}
Sự cố: mở không thành công. Tệp không bao giờ được tạo và trong quá trình viết, tôi nhận được ngoại lệ vì không có tệp mở.
FileManager :: open() chức năng:
void FileManager::open(std::string const& filename)
{
if(stream_.is_open())
stream_.close();
stream_.open(filename.c_str());
}
và viết
void FileManager::write(std::string const& data)
{
if(stream_.is_open())
stream_ << data;
else
throw FileException("Error. No file opened.\n");
}
Tuy nhiên, nếu tôi có thể tạo các tập tin trước, sau đó nó không có rắc rối mở tập tin. Tuy nhiên, khi tôi kiểm tra, mặc định std::ios::openmode
là std::ios::in | std::ios::out
. Tôi có thể tạo tệp chỉ tốt khi tôi chỉ gắn thẻ std::ios::out
, nhưng tôi muốn giữ luồng ở trạng thái đọc/ghi.
Tôi làm cách nào để thực hiện việc này?
Vì C++ 11, 'ios_base :: app' được cho phép và tương đương với" a ". Xem Bảng 132 trong C++ 11 hoặc C++ 14 cho bảng đã cập nhật. –