-1

次の形式のファイルにユーザー名とツイートを保存しています。

username1:message1:message2:...:messageN

username2:message1:message2:...:messageN

..。

usernameN:message1:message2:...:messageN

ユーザー名==新しいメッセージが添付されたユーザー名である行がファイルにある場合、上記の形式の行に:newMessageを追加します。

Cでこれを行うにはどうすればよいですか(それが重要な場合はcygwinで)?これが私が問題を抱えていると書いたコードブロックです。

         while(fgets(line, MAXBUFF, fp) != NULL){  // get each line of file
             if (strncmp(line, tweetUsr, strlen(tweetUsr)) == 0){
                 usrFound = 1;
                 fprintf(filePointer, ":");
                 fprintf(filePointer, tweet);
                 break;
             }

             memset(&line[0], 0, sizeof(line));  //reset line array
         }

filePointerは現在の行の終わりを指しているはずなので、メッセージが行の終わりに追加されることを期待していますが、実際に起こっているのは、メッセージがファイルの最後に追加されていることです。

fopenでr+モードを使用してこれを試しました。ファイルの終わりではなく現在の行に追加できるようにするには、何をする必要がありますか?

4

3 に答える 3

9

ファイルの途中にデータを挿入することはできません。書き込もうとすると、すでにそこにあるデータを上書きすることになります。

これを実行する場合は、次のことを行う必要があります。

  • fseek書きたい位置に
  • freadその時点からファイルの終わりまでバッファに
  • fwrite挿入したいもの
  • fwrite読み取ったバッファ
于 2013-03-25T00:47:52.190 に答える
4

JonathonReinhartの答えに代わる別の方法は次のとおりです。

  • 実際のファイルから1行ずつ読み取ります
  • 特定のユーザーの新しいメッセージを追加しながら、一時ファイルに書き込みます
  • 完了したら(正常に完了)、元のファイルを削除し、一時ファイルの名前を変更/元のファイルに移動します。

このアプローチでは、一度に複数のユーザーのメッセージを追加する場合に、パフォーマンスが向上します(各ユーザーが新しいメッセージを受け取る最悪の場合)。

于 2013-03-25T00:59:51.163 に答える
0

必要なのは、シーケンシャルファイルよりも柔軟な構造です。何らかの形式のデータベースを使用して、ユーザーのメッセージのリストにメッセージを追加します。

于 2013-03-25T02:55:08.637 に答える