2016-04-17 9 views
-2

ファイルから入力を読み取ることができません。私のコードが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; 
} 

char sku_[8] 

を宣言される

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私は時間のためにこれに取り組んが、解決策を見つけるためには至っていないされています。

+1

コードに特定のエラーメッセージが表示されていますか? –

+0

いいえ、すべてがセグメンテーションフォールトです。 –

+0

'file.getline(n、 '、');'がエラーであることを[既に伝えました](http://stackoverflow.com/a/36668283/4944425)あなたのコードで 'file.getline(n、7、 '、');'を使うべきだということです。ユーザーからの回答をお読みください。 –

答えて

0

私の以前の回答は申し訳ありませんが、明らかに正しくありませんでした。

セグメンテーションフォールトは、プログラムがそれに属していないメモリ位置にアクセスしようとしていることを意味します。言い換えれば、(適切に)初期化されていないか、範囲外のポインタ(ここではあまりない可能性がある他のいくつかのオプション)を書いたり読んでいるということです。

あなたはstrncpyでクラッシュしたと書きましたが、唯一の参照はsku関数内にあります。 "set name"関数はありませんが、 "name"関数ではstrcpy呼び出しがあります。 strncpyとstrcpyの違いに注目してください。製品:: sku(..)は、strncpyを使用してsku_にコピーしますが、Product :: sku(..)が実行されているときにスコープ内にあるか、スコープ内にあるか、または初期化されているかは不明です。 main関数はAmaProduct名前空間(またはクラス)にあり、その他はProductにあります。それは目的ですか?どの名前空間にsku_が宣言されていますか?

Product :: name(char * name)関数はstrcpyを呼び出します。strcpyは、名前がゼロで終了する文字列であることを前提としています。それがゼロ終端されていますか?そうでない場合、それは書き込みを続行し、segfaultをスローします。おそらく、file.getline()の読み込みに最大数の文字を追加することも賢明です。最大数は、宛先バッファのサイズに対応する必要があります。

また、関数の名前を変数と同じにすることは賢明ではないと考えられます。明確で意味のある名前を付けることで、コードのロジックを見たりデバッグしたりすることが容易になります。

最後に、デバッグの詳細については、http://www.cprogramming.com/debugging/segfaults.htmlを参照してください。

関連する問題