无法读取文件中的输入

时间:2016-04-17 19:14:58

标签: c++ fstream

我无法从文件中读取输入。每次我的代码达到strncpy时,我的代码都会中断,我无法找出原因。代码似乎在set name函数处破解。

fstream& AmaProduct::load(std::fstream& file){
    char s[7];
    char* n;
    n = new char[7];
    double p;
    bool t;
    int q;
    int nn;
    file.open("amaPrd.txt");
    if (file.is_open()){
        file.ignore(2);
        file.getline(s,',');
        cout << s;
        sku(s);
        file.ignore();
        file.getline(n,',');
        name(n);
        file.ignore();
        file >> p;
        price(p);
        file.ignore();
        file >> t;
        taxed(t);
        file.ignore();
        file >> q;
        file.ignore();
        quantity(q);
        file.getline(unit_, ',');
        file.ignore();
        file >> nn;
        qtyNeeded(nn);
    }
    file.close();
    return file;
}

这是在这里设置的:

void Product::sku(char* sku){
    strncpy(sku_,sku,7);
    sku_[7]=0;
}
void Product::price(double price){
    price_=price;
}
void Product::name(char* name){
    delete[] name_;
    name_= new char[strlen(name)+1];
    strcpy(name_,name);
}
void Product::taxed(bool tax){
    taxed_=tax;
}
void Product::quantity(int q){
    quantity_=q;
}
void Product::qtyNeeded(int n){
    qtyNeeded_=n;

sku被宣布

  char sku_[8]

我已经在这方面工作了好几个小时但尚未找到解决方案。

1 个答案:

答案 0 :(得分:0)

很抱歉我之前的回答显然不正确。

分段错误意味着您的程序正在尝试访问不属于它的内存位置。换句话说,您正在编写或读取尚未(正确)初始化或超出范围的指针(以及此处不太可能的其他几个选项)。

你写道它在strncpy崩溃了,它的唯一引用是在sku函数中。您没有“设置名称”功能,但在“名称”功能中有一个strcpy调用。注意strncpy和strcpy之间的区别。

您的函数Product :: sku(..)使用strncpy复制到sku_,但不清楚您在何处声明它以及它是否在范围内或者在Product :: sku(..)运行时已初始化。主要功能在AmaProduct命名空间(或类)中,而其他功能在Product中。这是故意的吗? sku_声明了哪个命名空间?

Product :: name(char * name)函数调用strcpy,它假定name是一个以零结尾的字符串。你确定它是零终止的吗?如果没有,它将继续写入并抛出段错误。为file.getline()添加最大字符数可能也是明智之举。最大数量应与目标缓冲区的大小相对应。

此外,将函数命名为与变量相同被认为是不明智的。拥有清晰且有意义的名称可以更容易地查看和调试代码的逻辑。

最后,请参阅http://www.cprogramming.com/debugging/segfaults.html以获取有关调试的更多帮助。