2014-03-06 34 views
1

上一类项目工作到文件,所以必须使用的fstream(用于输入/输出)的unique_ptr,并创建新的文件中写入固定长度的员工记录到(使用员工的EmployeeRec结构) 。问题编写与fstream的

的数据时,我实际上并不被写入以下......至少我没有表现流中它在Visual Studio中寻找和文件从来没有真正建立,我可以找到在任何时候数据该程序的目录。编译好,但我必须错过一些东西。有任何想法吗?

适用代码:

在Employee.h:

class Employee{ 
    int id; 
    std::string name; 
    double salary; 

    struct EmployeeRec{ // Employee file for transfers 
     int id; 
     char name[31]; 
     double salary; 
    }; 
void write(std::ostream&) const; 
}; 

在Employee.cpp:

// Write an Employee record to file 
void Employee::write(ostream& os) const{ 
    EmployeeRec outbuf; 
    outbuf.id = id; 
    strncpy(outbuf.name, name.c_str(), 30)[30] = '\0'; 
    outbuf.salary = salary; 
    os.write(reinterpret_cast<const char*>(&outbuf), sizeof outbuf); 
} 

在我的主要驱动力:

// "employee.bin" does not exist prior 
// EmpVect is a vector of unique_ptr<Employee> that has a few Employees already stored 
fstream emprecs("employee.bin", ios::in | ios::out | ios::binary); 
for (size_t i = 0; i < EmpVect.size(); ++i){ 
    (EmpVect[i])->write(emprecs); 
} 

回答

0

添加一些错误检查(ex is_open())来检查文件是否已经被打开。这可能是不被创建的文件,因为你没有权限等

你可以得到使用strerror的错误描述() http://www.cplusplus.com/reference/cstring/strerror/

而且,看看ofstream的。 http://www.cplusplus.com/reference/ostream/ostream/?kw=ostream

+1

你说得对。该文件实际上并未因某种原因而被打开。我不知道为什么,但是当在fstream上显式调用.open()时,它确实解决了这个问题。谢谢! – CGutz

0

难道是因为EmployeeRec的INT成员的? 您将reinterpret_casting一个int结构的偏移量为0的const char *。根据你的id实际是什么,以及系统的字节顺序,EmployeeRec结构的第一个字节很可能是零。然后编写一个空终止的C字符串,其第一个字节是空终止符。

+0

在任何情况下,由于您使用的reinterpret_cast(也许是最危险的类型转换)的东西,是不是'为const char *'的'为const char *'转换代码未定义的行为。 –

+0

获取数据的地址并将其转换为char *,以便您可以将它写出来作为二进制文件是完全合法的。看看http://www.cplusplus.com/reference/ostream/ostream/write/。 *写*写出未格式化的数据块。 –

+0

我站好了。谢谢。将其与编写格式化数据的函数混合使用。 –