在C中,如何附加到文件行而不是文件的末尾?

时间:2013-03-25 00:44:14

标签: c io printf

我将用户名和推文存储在文件中,格式如下:

USERNAME1:MESSAGE1:消息2:...:messageN

USERNAME2:MESSAGE1:消息2:...:messageN

...

usernameN:MESSAGE1:消息2:...:messageN

如果文件有一行,其中username ==带有新消息的用户名,我想将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 +模式尝试了这个。为了能够附加到当前行而不是文件末尾,我该怎么做?

3 个答案:

答案 0 :(得分:9)

您无法在文件中间插入数据。如果你试着写,你将会写出已经存在的数据。

如果你想这样做,你需要:

  • fseek到您要写入的位置
  • fread从那一点到文件末尾的缓冲区
  • fwrite您要插入的内容
  • fwrite您宣读的缓冲区

答案 1 :(得分:4)

Jonathon Reinhart回答的另一个选择是:

  • 逐行从实际文件中读取
  • 在添加某些用户的新消息时写入临时文件
  • 完成后(成功完成)删除原始文件并将临时文件重命名/移动到原始文件。

如果您一次添加多个用户的邮件,这种方法将带来更多性能(在每个用户都有新邮件的最坏情况下)。

答案 2 :(得分:0)

您需要的是一种比顺序文件更灵活的结构。使用某种形式的数据库,并将消息附加到用户的消息列表中。