2016-08-14 55 views
-1

CSV txtファイルから配列構造体にデータを取り込むプログラムを作成しています。このデータは在庫を管理するために使用されます。私はプログラム全体を動作させていましたが、実行するたびに突然クラッシュします。 Iv'eは私のファイルの読み込み機能にクラッシュを絞り込み、問題が見えるかどうか疑問に思っていました。ここに初期ファイルのデータがあります。ここでCSVファイルを構造体配列に読み込む

1000,1.49,3.79,10,0,Fish Food 
2000,0.29,1.59,100,1,Angelfish 
2001,0.09,0.79,200,0,Guppy 
5000,2.40,5.95,10,0,Dog Collar (Large) 
6000,49.99,129.99,3,1,Dalmatian Puppy 

はここ

struct inventory_s 
{ 
int productNumber; 
float mfrPrice; 
float retailPrice; 
int numInStock; 
char liveInv; 
char productName[PRODUCTNAME_SZ]; 
}; 

構造体配列

struct inventory_s inventory[MAX_INVENTORY]; 

は、私はあなたが数の両方としてMAX_INVENTORYを使用

FILE* pFile; 
char *buf = malloc(MAX_INVENTORY); 
char *info; 
if ((pFile = fopen("inventory.txt", "r")) == NULL) //Reading a file 
{ 
    printf("File could not be opened.\n"); 
} 

int i = 0; 
while (fgets(buf, MAX_INVENTORY, pFile) != NULL) 
{ 
    if ((strlen(buf)>0) && (buf[strlen (buf) - 1] == '\n')) 
     buf[strlen (buf) - 1] = '\0'; 

    info = strtok(buf, ","); 
    inventory[i].productNumber = atoi(info); 

    info = strtok(NULL, ","); 
    inventory[i].mfrPrice = atof(info); 

    info = strtok(NULL, ","); 
    inventory[i].retailPrice = atof(info); 

    info = strtok(NULL, ","); 
    inventory[i].numInStock = atoi(info); 

    info = strtok(NULL, ","); 
    inventory[i].liveInv = *info; 

    info = strtok(NULL, ","); 
    strcpy(inventory[i].productName, info); 

    i++; 
    } 

    fclose(pFile); 
    return 0; 
+1

このような問題をデバッグする方法は、デバッガを使用することです。また、まずは 'strtok'の各戻り値をチェックして失敗しなかったことを確認してください。 – kaylum

+0

最後に余分な空白行を追加していませんか? kaylumが言ったように、あなたのコードはひどくフォーマットされた行には強固ではありません。 –

+0

Cの勉強はいかがですか?あなたは前回(ユーザーアカウントの変更)に多くの同じ基本的な質問をしました。 Cの本を手に入れよう。宿題ヘルパーサイト。あなたはまずあなた自身で何らかの努力をすることが期待されます。 – Olaf

答えて

0

を持っているコードである構造の減速でのそしてbufの長さである。両者の間には何の関係もありません。構造体の数とは別に最大行の長さを定義する必要があります。

構造体が10個ありますが、行の長さが約30の場合は、行の一部だけを読み込み、解析が中断され、carshが発生する可能性があります。

+0

良い発見! 'char buf [MAX_INVENTORY];'がメモリリークのリスクなしでうまくいく場合は、 'char * buf = malloc(MAX_INVENTORY);' –

+0

@Israel Unterman私はそれを変更し、まだクラッシュを取得します。 whileループが正しく機能していないことは確かです。設定方法に問題はありますか? –

+0

@ JohnM.904質問を更新して、あなたが変更した内容を正確に表示してください。それ以外の場合は、あなたが変更したものを誤解するのは簡単です。そしてあなたがそれをしている間に、 'strtok'戻り値のチェックを追加し、同様にそれを表示します。あなたが基本をするまでは、あなたの疑問を積極的に進めるのではありません。 – kaylum

関連する問題