2017-07-21 8 views
-2
#include <stdio.h> 
#define MAX_TITLE_SIZE 20 
#define MAX_BOOKS 10 

struct Book { 
    int _isbn; 
    float _price; 
    int _year; 
    char _title[MAX_TITLE_SIZE + 1]; 
    int _qty; 
}; 

void clear(void); 
int readRecord(FILE *fp, struct Book *b2read); 
void displayInventory(const char filename[]); 



int main(void) { 

    struct Book myBook; 
    char filename[21] = "144_w9_inventory.txt"; 

    displayInventory(filename); 

    return 0; 
} 

void clear(void) { 

    while (getchar() != '\n'); 

} 

int readRecord(FILE *fp, struct Book *b2read){ 

    //Define a variable int rv = 0 
    int rv = 0; 


    rv = fscanf(fp, "%d;%f;%d;%d;%20[^\n]", &(b2read->_isbn), &(b2read->_price), &(b2read->_year), &(b2read->_qty), b2read->_title); 
    //return rv; 

    return rv; 
} 

void displayInventory(const char filename[]) { 

    struct Book myBook; 

    FILE *fp = NULL; 
    int i; 

    fp = fopen(filename, "r"); //open the file for reading 

    if (fp != NULL) { 

     printf("\n\nInventory\n"); 
     printf("===================================================\n"); 
     printf("ISBN  Title    Year Price Quantity\n"); 
     printf("---------+-------------------+----+-------+--------\n"); 

     while(readRecord(fp, &myBook) == 5){ 
     printf("%-10.0d%-20s%-5d$%-8.2f%-8d\n", myBook._isbn, myBook._title, myBook._year, myBook._price, myBook._qty); 
     } 
     printf("===================================================\n"); 
     printf("\n"); 

     fclose(fp); 
    } 
    else { 
     printf("Failed to open file\n"); 
    } 
} 

は次のとおりです。Cのテキストファイルから値をスキャンするときに入力バッファをクリアする方法は?テキストファイル内にある何

234562;23.99;2010;3;Harry Potter 
567890;12.67;2015;4;The Hunger Games 
109821;53.20;2017;2;Stranger Things 

出力:

Inventory 
=================================================== 
ISBN  Title    Year Price Quantity 
---------+-------------------+----+-------+-------- 
234562 Harry Potter 
     2010 $23.99 3  
567890 The Hunger Games 
    2015 $12.67 4  
109821 Stranger Things  2017 $53.20 2  
=================================================== 

私は出力私はすべての値を取得することができるよが、プログラム何らかの理由でI文字列全体が半分になり、1行下にシフトした値を出力します。あなたが見てみたい場合は

repl.itはここにある:

https://repl.it/JbRy/69

私は出力を単一の行にプリントアウトしてもらうにはどうすればよいです。そうであれば\ n "改行"を読むのではなく?

+1

このコードは正常に見える、と私のシステムで期待どおりに動作します。再現できません。これはコードを実行しているオンラインテスト環境とは関係がないと確信していますか? –

+0

あなたは@DavidBowlingですが、Visual Studioで動作しましたが、repl.it環境では別の方法でコンパイルされました。 repl.itを使用して、テストするたびにVSの新しいインスタンスを作成するのではなく、出力をテストします。 – mincedMinx

答えて

-1

「ハリー・ポッター」と「ストレンジャー・シングス」の違いは、「ストレンジャー・シングス」はテキストファイルに改行がないことです。 「Harry Potter」と「The Hunger Games」には「\ r」が残っているようです。

これを試してください。

rv = fscanf(fp, "%d;%f;%d;%d;%20[^\r\n]", &(b2read->_isbn), &(b2read->_price), &(b2read->_year), &(b2read->_qty), b2read->_title); 
+0

'\ r'は改行ではありません。 – Olaf

+0

https://en.wikipedia.org/wiki/Carriage_return – gwangsoo

+0

これがOPの問題をどのように説明するのか分かりにくいです。入力ファイルで改行が '\ r \ n'の場合、欠落した' \ r'はカーソルを現在の行の先頭に移動させ、次の行の先頭に移動させません。入力ファイル、オンラインテスト環境、またはその両方で怪しいものがあるようです。 –

-1

「入力バッファをクリアする」とは関係ありません。 fscanf()は指定した通りに消費します。 「消去」は必要ありません。を正しくスキャンする必要があります。どういうわけか、あなたはタイトルの行終端文字を取得しています。 fscanf()形式の文字列を修正してください。

-1

fscanfの場合は少し欠けています。 [^\n]\rを含める必要があります。 これにより、キャリッジリターンまたは改行のいずれかが発生したときに読み込みを停止するように指示します。fscanfこのよう

rv = fscanf(fp, "%d;%f;%d;%d;%20[^\n\r]", &(b2read->_isbn), &(b2read->_price), &(b2read->_year), &(b2read->_qty), b2read->_title); 
関連する問題