0

fwrite()最初の, が機能する理由はわかりませんが、メッセージのシンボルのcustomer2 番目は機能しません。fwrite()私のプログラムは、顧客とメッセージのシンボルがすでにライブラリに含まれているかどうかを確認したいと考えています.dat。これが私のコードです:

typedef struct {
    char Name[50];
    int totalmsg;
    int totalword;
} Customer;

typedef struct {
    char symbol;
    char alphabet[20];
} Ssymbol;

void add_customer () {
    boolean found;
    int i;

    fp = fopen("customer.dat", "wb+"); 
    fread(&Customer_history, sizeof(TabInt), 102, fp);

    i = GetLastIdx(Customer_history);
    do {
        printf ("Please input customer's name: ");scanf("%s",&temp); 
        if (i == 0) {
            i++;
            SetName(&Customer_history,i,temp);
            SetMsg(&Customer_history,i,i);
            SetEff(&Customer_history,i);
            printf("Do you still wanna add another customer ?(Y/N)"); scanf("%s",&CC);
        }
        else {
            found = Search_name(Customer_history,temp);
            if (found == true) {
                printf("The name is already exist \n\n");
            }
            else {
                i++;
                SetName(&Customer_history,i,temp);
                    SetMsg(&Customer_history,i,i);
                    SetEff(&Customer_history,i);
            }
            printf("Do you still wanna add another customer ?(Y/N)"); scanf("%s",&CC);
        } 
    } while ((CC == 'y') || (CC =='Y'));
    fwrite(&Customer_history, sizeof(Customer), 102, fp);
    fclose(fp);
}

void add_symbol() {

    char tempc;
    char tempalphabet[20];
    boolean found;
    int i;

    fp = fopen("library.dat","wb+");

    fread(&list_symbol, sizeof(Ssymbol), 52, fp);

    i = GetLastIdx2(list_symbol);

    do{
        printf("Please input new symbol:");
        scanf("%s", &tempc);

        printf("Please input the alphabet of the symbol:");
        scanf("%s", &tempalfabet);

        if (i==0){
            i++;
            SetSymbol(&list_symbol,i,tempc);
            SetAlphabet(&list_symbol,i,tempalphabet);
            printf("Do you want to add another symbol? (Y/N)");
            scanf("%s",&CC);
        }      
        else{
            found = Search_symbol(list_symbol, tempc);
            if (found==true){
                printf("Symbol is already exist \n\n");
            }
            else{
                i++;
                SetSymbol(&list_symbol,i,tempc);
                SetAlphabet(&list_symbol,i,tempalphabet);
                printf("Do you want to add another symbol? (Y/N)");
                scanf("%s",&CC);
            }            
        }
    }

    while((CC=='y') || (CC=='Y'));

    fwrite(&list_symbol, sizeof(Ssymbol),52, fp);
    fclose(fp);
}
4

4 に答える 4

4

ここで単一の文字のみを期待している場合:

scanf("%s", &tempc);

次に、次のように変更します。

scanf("%c", &tempc);

それ以外の場合は、tempc を配列として定義する必要があります (使用しないでください&)。

ここでも tou は配列を渡しているため、address-of ( &)を使用しないでください。

printf("Please input the alphabet of the symbol:");
// scanf("%s", &tempalfabet); is wrong
scanf("%s", tempalfabet); // correct

コード内のすべての scanf 呼び出しを調べて修正する

于 2012-12-03T07:27:27.690 に答える
2

コードのより「コンパイル可能な」バージョンがなければ、言うのは難しいです...ここにいくつかのポイントがあります:

A)booleanは C の型ではありません。次のようなものが必要です。

#include <stdbool.h> // or some other header that defines bool
typedef bool boolean;

失敗した場合:

typedef int boolean;
#define false 0
#define true 1

B)どちらadd_customer()add_symbol()使用fpするかは定義されていません。これらの操作には を定義する必要がありますFILE * fp

C) 次の (と思われる) メソッドが定義されていません: GetLastIdx(), SetName(), SetMsg(), SetEff(), Search_Name(), GetLastIdx2(), SetSymbol(),SetAlphabet()Search_symbol()

D) 次の (と思われる) グローバル変数とデータ構造体が定義されていません: Customer_history, TabInt, temp, CC, list_symbol,tempalfabet

問題の説明に基づいて、これが機能していると想定しているため、これらはすべて定義する必要があります。問題を示すコードの、より完全でコンパイル可能なバージョンを提供できる場合は、さらに役立つ可能性があります。

だから私が持っているものに基づいて、ここにいくつかの入力があります:

1) を読み込んでいますlist_symbol。これは、 に十分な大きさのメモリ ブロックへのポインタである必要があり52*sizeof(Ssymbol)ます。これは約 1092 バイトである必要があります。

fread(&list_symbol, sizeof(Ssymbol), 52, fp);

また、 が s のlist_symbol配列である場合、構造内に配列があり、データをバイトごとに正確に読み取って埋めるSsymbolという事実によって、読み取りコードが台無しになることに注意してください。例えば:fread()

Ssymbol list_symbol[52];
FILE * fp = fopen("test.txt", "r");
memset(list_symbol, 0, 52*sizeof(Ssymbol));
fread(list_symbol, sizeof(Ssymbol), 52, fp);

そして、「test.txt」に次のものが含まれているとしましょう:

C abcdefghijklmn
3 12345678

次に、あなたは次のlist_symbolようになります:

list_symbol[0].symbol = 'C'
list_symbol[0].alphabet = ' abcdefghijklmn3 12' //note the newline and spaces fill it
list_symbol[1].symbol = '3'
list_symbol[1].alphabet = '45678'

そして、それはあなたがやりたかったことではないかもしれません。データが構造と一致していることを確認してください!

2)あなたscanf()が完全に示しているものは間違っています:

char tempc;
...
scanf("%s", &tempc);

文字が必要な場合は、「%s」ではなく「%c」が必要です。上記の他の宣言 (ポイント D を参照) は表示されませんが、印刷物と使用法に基づいて、ほぼ確実に間違っているtempalfabetことがわかります。CC

3) あなたscanf()の s は、消費しない限り改行文字を残します:

printf("Please input new symbol:");
scanf("%c\\n", &tempc);  // <-- escaped newline will do that for you

4) 「wb+」でファイルを開きます。バイナリ ファイルへの書き込みおよび追加用のfopen() オプションを参照してください。読み書きできるバイナリ ファイルが必要な場合は、"ab+" が必要です。テキスト ファイルが必要な場合は、"a+" で十分です。

5) ファイル ポインタをリセットしません。

fopen(file for reading, writing, and appending);
fread(stuff);
do c code;
fwrite(stuff);

これにより、書き込んだ内容がファイルの末尾に追加されます。それがあなたの望みかどうかはわかりません。したがって、完全なデータを読み取り、新しいセットをファイルの末尾に追加する場合、これは問題にならない可能性がありlist_symbolます。ただし、ファイルの内容を上書きしたかったのではないかと思います...その場合、fseek ()を最初に戻すか、単にファイルを閉じて開くことができます。

于 2012-12-05T16:10:22.333 に答える
0

コード全体が利用できないため、問題を推測しようとしています..

シンボル数が 52 を超えていて、最初の 52 シンボルだけを書いている可能性はありますか? したがって、fwrite は実際に機能していますが、データ ファイルは変更されていません。i(=GetLastIdx2) を printf してみて、52 を超えていないか確認してください。

また、list_symbols の配列を使用する代わりに、リンク リストと fread/fwrite を使用し、while ループを使用して、データ ファイル内のすべてのシンボルを読み書きすることをお勧めします。

于 2012-12-01T15:46:21.140 に答える