【问题标题】:C++ write to a specific part of text file without overwritingC++ 写入文本文件的特定部分而不覆盖
【发布时间】:2012-11-14 19:27:06
【问题描述】:

我正在编写一个简单的日历应用程序,它将数据保存在一个文本文件中。我使用 iCalendar 格式,所以我的文本文件以“END:VCALENDAR”结尾。

当用户添加新事件时,应用程序应该在文本文件末尾写入关联数据而不覆盖“END:VCALENDAR”,我该怎么做?删除保存在文本文件中间的事件怎么样?是否需要使用更新的数据再次写入整个文件?非常感谢。

【问题讨论】:

    标签: c++ file


    【解决方案1】:

    您不能通过在文件中间写入来动态“扩展”文件。 您需要:

    1. 将整个日历反序列化到内存中,然后将其写回(最佳选择)
    2. 将超出您要插入数据的点的所有内容读入内存,写入数据,然后写入存储的文件“tail”

    【讨论】:

      【解决方案2】:

      没有任何方法可以插入文件中间;底层操作系统不支持它。通常的技术是将文件复制到一个临时文件中,沿着这条线进行任何您需要的修改,然后(并且如果副本的输出没有错误 - 请验证在关闭后输出流没有失败)删除输入文件并将临时文件重命名/移动到原始名称。

      【讨论】:

      • 关闭后如何检查输出流是否失败?通过逐字节浏览文件,还是使用一些 c++ 函数?
      • 只是通过测试,就像你通常会做的那样:if ( output ) /* OK */ else /* failed */,或if ( !output ) // failed
      【解决方案3】:

      C++ 库不支持与 append 不同的方法,该方法提供在文件的任何特定位置插入的选项;无论是文本文件还是二进制文件。

      那么您有两种选择: 第一个是您假设的,即读取整个文件,更新数据并再次写回。 其次是在文件中寻找最后一行的第一个字符E,如END:VCALENDAR,写下你的事件,然后将“END:VCALENDAR”附加到它上面。

      是的,您可以通过编程方式在最后一个换行符之后找到最后一行的第一个字符 E。 抱歉,据我所知,没有其他办法。

      【讨论】:

        猜你喜欢
        • 2011-05-08
        • 1970-01-01
        • 2012-04-15
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多