2017-02-19 14 views
-2

このコードは、スキャンしてデータベースから最初の行を印刷した後にクラッシュします。私は本当にこれに対する解決策を見つけることができませんでした。最初の行をスキャン/印刷した後にコードがクラッシュする

クラッシュのショット:データベースの

Crash

内容:

Matthew Summers 53901523 256325 135500 
Jacob Sutherland 52392302 723232.2 1200000 
Michael Phelps 58238211 971000.52 653350 
Aaron Gordon 59923325 325700.92 623320 
Vasil Maglaperidze 59952323 189900.32 330000 
Avtandil Shoshiashvili 95234322 432000.72 723023 
Michael Jordan 35252372 120899.75 50000 
Daniel Whiteman 85238202 178500.53 349800 
James Oneal 98773235 90750.23 197050 
Haytheim Russels 19326233 178250.22 221580 

マイコード:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define CHAR_BUF 128 
#define DATA_FILE "database.txt" 

typedef struct client 
{ 
    char fname[CHAR_BUF]; 
    char lname[CHAR_BUF]; 
    int pnumber; 
    float wins; 
    float loses; 
    float ratio; 
}client; 

int ReadData(FILE *fp); 

int main() 
{ 
    //int lines=0; 
    //client client[i]; 
    FILE *fp = fopen(DATA_FILE, "r"); // opens file 
    if(fp==NULL) // checks if .txt file is empty 
    { 
     printf("Database is empty."); 
     exit(1); 
    } 
    ReadData(fp); // Calls function to read db 
    //lines = ReadData(fp); 
    //printf("Line amount: %d", lines); 
} 


/* This function reads data from database 
* and assigns values to their variables 
*/ 
int ReadData(FILE *fp) 
{ 
    int i=0; 
    client client[i]; 
    while(!feof(fp)) 
    { 
     fscanf(fp, "%s %s %d %f %f", client[i].fname, client[i].lname, 
     &client[i].pnumber, &client[i].wins, &client[i].loses); 
     printf("%s %s %d %.2f %.2f\n", client[i].fname, client[i].lname, 
     client[i].pnumber, client[i].wins, client[i].loses); 
     i++; 
    } 
    return i; 
} 
+1

、このような問題を解決するための適切なツールは、あなたのデバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+1

なぜこのタグはC++ですか? – Biffen

+1

'client client [i];'はクライアントクライアント[0]です。 – BLUEPIXY

答えて

0
  1. int i=0; 
    client client[i]; 
    

    これはサイズ0の配列を作成します
    変更をそれに(どんな意味がありません。):最後のレコードがファイルから読み込まれた

    #define MAX 30 
    
    client client[MAX]; 
    
  2. while(!feof(fp)) 
    

    最後にはまだ\nがあります。だから、この式が評価されるときにはfeof(fp)FALSEを返すが、ファイルの終わりではない。
    しかし、次の行のfscanf(fp, "%s %s %d %f %f", client[i].fname, client[i].lname, &client[i].pnumber, &client[i].wins, &client[i].loses);eofとなり、scanfは失敗します。
    最後のガベージ・ラインについて説明します。
    ソリューション:
    scanfが成功したかどうかを確認し、成功した場合はprintfのみ実行してください。

    while(fscanf(fp, "%127s %127s %d %f %f", client[i].fname, client[i].lname, &client[i].pnumber, &client[i].wins, &client[i].loses) == 5) 
    {  
        printf("%s %s %d %.2f %.2f\n", client[i].fname, client[i].lname, client[i].pnumber, client[i].wins, client[i].loses); 
        i++; 
    } 
    
+0

ありがとうございました。それは完璧だ。 ojaxis tkvnis survilebit、 レヴァン –

関連する問題