【问题标题】:In C, how do I append to a file line but not the end of the file? [duplicate]在 C 中,如何附加到文件行而不是文件末尾? [复制]
【发布时间】:2013-03-25 00:44:13
【问题描述】:

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

用户名1:message1:message2:...:messageN

用户名2:message1:message2:...:messageN

...

用户名N: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+ 模式进行了尝试。我必须做什么才能追加到当前行而不是文件末尾?

【问题讨论】:

    标签: c io printf


    【解决方案1】:

    您不能在文件中间插入数据。如果您尝试写入,您将写入已经存在的数据。

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

    • fseek到你想写的位置
    • fread 从那个点到文件的末尾进入一个缓冲区
    • fwrite你要插入的内容
    • fwrite你读出的缓冲区

    【讨论】:

      【解决方案2】:

      乔纳森·莱因哈特的答案的另一种选择是:

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

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

      【讨论】:

      • 谢谢,这对我的实现最有意义
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-11
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 2012-06-03
        • 1970-01-01
        相关资源
        最近更新 更多