0

私は C プログラミングのクラスを取っています。私はこのプロジェクトを持っています。彼らは私たちに半完成のプロジェクトを与えてくれます。私たちはそれを完成させ、いくつかの機能を修正する必要があります。このプロジェクトは、一種のソーシャル ネットワークに関するものです。このプロジェクトでは、ターゲット ユーザーを書き込んでからメッセージを入力することで、他のユーザー (現在は同じコンピューター上) にメッセージを送信できます。その後、メッセージは同じフォルダーの「messages.txt」というファイルに、「[At]25/08/2013 [From]user1 [To]user2 [Message]hello whats up?」という形式で保存されます。「[At]Date [From]user [To]user2 [Message]any user input」これを書いた後、2番目のユーザーに行き、この関数でファイルから読み取ろうとします:

void showUnreadMessages(char* userName) // the function gets the name of the current 
user that wishes to read his/hers messages
{
    char msg[MAX_MESSAGE];
    char toU[MAX_USER_NAME];
    char fromU[MAX_USER_NAME];
    char at[15];
    int count = 0, flag = 0, count1 = 0;
    FILE *file = fopen(MESSAGE_FILENAME, "rt"); //open the messages file
    FILE *temp;
    clearScreen(); //system("CLS")
    if (file == NULL) //if the file didn't exict open one
    {
        printf("No messages\n");
        flag = 1;
        _flushall();
        file = fopen(MESSAGE_FILENAME, "wt");
        _flushall();
    }
    while (!feof(file) && flag == 0) //if the file did exict
    {
        if (count1 == 0)
        {
            temp = file;
        }
        _flushall();
        fscanf(file, "[At]%s [From]%s [To]%s  [Message]%s\n", at, fromU, toU, msg); //scan one line at a time
        _flushall();
        if (strcmp(userName, toU) == 0) //if the userNames match than its a message for the current user
        {
            count++;
        }
        count1++;
    }
    fclose(file);
    if (count > 0 && flag == 0) //if there are messages to user
    {
        printf("You have %d new Messages\n", count);
        _flushall();
        while (!feof(temp))
        {
            _flushall();
            fscanf(temp, "[At]%s [From]%s [To]%s  [Message]%s\n", at, fromU, toU, msg); //scan one line at a time to print it for the user
            _flushall();
            if (strcmp(userName, toU) == 0)
            {
                printf("New message at %s from: %s\nStart of message: %s\n-----------------------------------------\n", at, fromU, msg);
            }
        }
        fclose(temp);
    }
    else if (count == 0 && flag == 0)
    {
        printf("You have no Messages\n");
    }
    if (!file)
    {
        remove(MESSAGE_FILENAME);
    }
    PAUSE; // system("PAUSE")
}

この関数で読み取ろうとすると、メッセージが最初の行のメッセージ セクションの最初の単語であることが示されるだけです...たとえば、「[At]25/08/2013 [From]user1 [To]」の場合user2 [メッセージ]こんにちは、お元気ですか?" メッセージは「hello」になり、2回出力されます..何をすべきかわかりません。何らかの理由で、ファイルを開いてfscanfを1回実行すると、ポインターファイルが「up?[At] ...(2行目に表示されるもの)」

私が何を間違えたのか理解できたら助けてください(私はそれがたくさんあることを知っています)事前に感謝します

4

2 に答える 2

1

fscanf のこの部分:

 "..etc.  [Message]%s\n"

%s は連続した文字を解析するため、"Hello what's up" の 1 語のみを読み取ります。

nr_fields = fscanf(file, "[At]%s [From]%s [To]%s  [Message]%80c\n"

テキスト メッセージのスペースなどに関係なく、最大 80 文字を読み取ります。また、%80c の宛先は 80 文字以上にする必要があります。

また、fscanf によって検出されたフィールドの数を常にテストします。

最後に、fscanf は指示どおりに使用すると機能しますが、いくつかの微妙な側面があります。

于 2013-08-28T00:15:44.473 に答える