4

いくつかのレコードをファイルに入力するための小さなプログラムを作成しました。

#include<stdio.h>

int main(void)
{
    FILE *fp;
    //opening a file to write
    fp = fopen("try.rec","w");
    if(fp == NULL)
    {
        printf("\nSorry! Couldn't Create File");
        exit(-1);
    }
    int id = 1;
    char name[300] = "Cipher", address[300] = "Virtual Street", phone[20] = "223322212";
    fprintf(fp,"%d, %s, %s, %s", id, name, address, phone);
    fclose(fp);
    return 0;
}

さて、これにはエラーはありません。しかし、私はそのレコードを読むための小さなプログラムも作成しました。

#include<stdio.h>

int main(void)
{
    FILE *fp;
    fp = fopen("try.rec","r");
    if (fp == NULL)
    {
        printf("Could not Access File. :(");
        return -1;
    }
    int id;
    char name[300], add[300], phone[20];
    fscanf(fp, "%d , %s , %s , %s",&id, &name, &add, &phone);
    fclose(fp);
    printf("\nDetails from File try.rec\n---------------------------\nID: %d \nName: %s \nAddress: %s \nPhone: %s \n", id, name, add, phone);
    return 0;
}

ただし、3番目の文字列を出力すると、ガベージ値が出力されます。深く掘り下げて、最初のプログラムで(最後に1つの余分なスペースを持って)置き換え"Cipher""Cipher "実行すると、2番目のプログラムの3番目の文字列はVirtual(スペースの後には何も)出力せず、4番目の文字列は再びゴミになることがわかりました。

それで、Cでファイルから文字列を入れて取得する他の良い代替方法はありますか?または私は私のプログラムのいずれかで間違ったことをしていますか?

あなたの助けを期待して!

前もって感謝します。

4

2 に答える 2

6

問題は、%sフォーマットがfscanf空白以外のすべての文字を読み取るように指示していることです。

fscanf(fp, "%d , %s , %s , %s",&id, &name, &add, &phone);

が読み込ま"Cipher,"れます(ただし、の代わりにname正しい引数があります)。その後、が見つからないため、次の変換は失敗します。name&namefscanf','

"Cipher "後にスペースがある場合、スペースが見つかった後にスキャンが停止し、次のスキャンがとの間のスペースで停止し"Virtual"ます。フォーマットで必要なもの"Street"がない','ため、それ以上の変換は失敗します。

の戻り値をチェックしfscanfて、適切な数の変換が行われたことを確認し、成功した変換が少なすぎる場合はそれに応じて状況を処理する必要があります。

ここでは、%[^,]文字セット形式を使用して文字列をスキャンできます。

fscanf(fp, " %d , %[^,] , %[^,] , %s", &id, name, add, phone);
于 2012-11-22T12:20:09.837 に答える
1

の戻り値を確認するとfscanf、成功した変換の数が返されます。また、fscanf空白(フォーマット文字列の空白)でトークンを区切るように関数に指示して、空白を含む文字列(のような"Virtual Street")が2つのトークンと見なされるようにします。

を使用して行全体を読み、をfgets使用strtokしてコンマの文字列を区切ることをお勧めします。

于 2012-11-22T12:20:49.010 に答える