从结构写入文件时的额外字符

时间:2014-01-19 10:51:41

标签: c++ file character

我有一个班级单位。这个类的对象有名称,id,预算和其他东西。我想将名称和预算保存在位置(i-1)的.txt文件中。我创建了名为Unit2的结构:

struct Unit2{

    string name;
    int budget;
};

我的file.write函数:

void writeBudgets(Unit name,int i) {
    ofstream file("C:\\Users\\User\\Desktop\\budgets.txt");
    Unit2 p;
    p.name  = name.getName();        //get name from the class Unit
    p.budget = name.getBudget();     //same for budget
    file.seekp((i-1)*sizeof(Unit2));
    file.write(reinterpret_cast<char*> (&p),sizeof(Unit2));
    file.close();
}

在主要的我创建单元“a”的对象,名称为“asd”,预算为120.当我使用writeBudgets函数时,会在我的文件中添加一个额外的字符。例如writeBudgets(a,2);给了我hÆPasd ÌÌÌÌÌÌÌÌÌÌÌÌ Œ。我该怎么办?

1 个答案:

答案 0 :(得分:4)

您不能将std::string这样写入文件,因为std::string对象本身没有实际的字符串,而是指向字符串及其长度的指针。 / p>

您应该做的是了解有关C ++ input/output库的更多信息,然后您可以为您的结构创建自定义输出运算符<<


您制作了自定义operator<<功能:

std::ostream& operator<<(std::ostream& os, const Unit2& unit)
{
    // Write the number
    os << unit.budget;

    // And finally write the actual string
    os << unit.name << '\n';

    return os;
}

使用上述功能,您现在可以进行例如。

Unit2 myUnit = { "Some Name", 123 };
std::cout << myUnit;

它将在标准输出上打印

123 Some Name

要读取结构,请创建相应的输入操作符函数:

std::istream& operator>>(std::istream& is, Unit2& unit)
{
    // Read the number
    is >> unit.budget;

    // The remainder of the line is the name, use std::getline to read it
    std::getline(is, unit.name);

    return is;
}