2016-08-14 10 views
1

コードは現時点では魅力のように機能します。しかし、出力の最後の2行はここで見てきたものと同じです。Cプログラミングコンパイラでtxt FILEを表示

ここで問題は何ですか?

データは、先にビルドされたtxtファイルからのものです。ここで

1 CADBURY 999 1.900000 
2 PEPSI 999 2.500000 
3 IPHONE 976 2500.000000 
4 SPIRULINA 100 50.000000 
2 PAIPSI 100 0.900000 
10 BLACKMORE 98 30.000000 
17 TROPICANA 13 1.500000 
17 TROPICANA 13 1.500000 

コードです:あなたは、プログラムの終了時にファイルの内容をプリントアウトしている場合、それは終わりを超えて読み取ろうとするまで、fscanf関数がfeofを設定しません

#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <ctype.h> 

int addProduct(); 

struct product { 
    int quantity, reorder, i, id; 
    char name[20]; 
    float price; 
}; 

int main() { 
    FILE *fp; 
    int i = 0; 
    struct product a; 

    system("cls"); 

    char checker; 
    int counter; 

    do { 
     fp = fopen("addproduct.txt", "a+t"); 
     system("cls"); 

     printf("Enter product ID : "); 
     scanf(" %d", &a.id); 

     printf("Enter product name : "); 
     scanf(" %s", a.name); 

     printf("Enter product quantity : "); 
     scanf(" %d", &a.quantity); 

     printf("Enter product price : "); 
     scanf(" %f", &a.price); 

     fprintf(fp, "%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price); 
     printf("Record saved!\n\n"); 

     fclose(fp); 

     printf("Do you want to enter new product? Y/N : "); 

     scanf(" %c", &checker); 
     checker = toupper(checker); 

     i++; 

     system("cls"); 
    } while(checker == 'Y'); 

    if (checker == 'N') { 
     fp = fopen("addproduct.txt", "r"); 

     while (!feof(fp)) { 
      fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price); 
      printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price); 
     } 
     fclose(fp); 
    } 
    return(0); 
} 

答えて

0

while (!feof(fp))は動作しません:入力が失敗した後feof(fp)真になります。最後の反復中にfscanf()は失敗しますが、戻り値はチェックされず、前の反復の値は最後のprintf()によって使用されます。

代わりに書く必要があります。

while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4) { 
    printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price); 
} 
+0

申し訳ありません。だから、4は単なる乱数であるか、それともカウンタを設定する必要がありますか? –

+0

'4 'は' fscanf() 'によって成功裡に実行される変換の数です:'%d'、 '%s'、'%d'、 '%f'です。 – chqrlie

+0

ありがとう、あなたがロック!神のご加護を :) –

0

ファイルの これは、ファイルの最後の行を読み取った後でも、feofはまだ真ではないことを意味します。 したがってループが続き、fscanfは別の行の読み込みを試みますが失敗します。変数a.id、a.nameなどは、fscanfの前回のループ実行後の変数と同じです。 結果を印刷する前にfscanfが期待した数のフィールドを返すことを確認する必要があります。例えば 、

...(関数fscanf(FP、 "%D%の%D%F" であれば、& a.id、a.name、& a.quantity、& a.price)== 4) printf( "%d%s%d%f \ n \ n"、a.id、a.name、a.quantity、a.price); ...

問題を修正します。

編集:申し訳ありません4つのパラメーターない5予想通り、固定

+0

'fscanf'フォーマット文字列は、わずか4変換仕様となっています。 – chqrlie

+0

大丈夫です。どうもありがとうございました !神の祝福:) –