c9894 2024-06-01 18:04 采纳率: 0%
浏览 83
已结题

ofstream覆盖写入

想问一下,这个为什么不能覆盖原来的文件,在新文件里可以正常输出

img

  • 写回答

10条回答 默认 最新

  • 阿齐Archie 优质创作者: 嵌入式与硬件开发技术领域 2024-06-01 18:18
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。

    在您提供的代码片段中,存在几个问题,这可能是导致不能覆盖原文件的原因。首先,代码中有一些语法错误,比如 <<end1; 应该是 << endl;。此外,您的代码中没有明确指定打开文件的方式,这可能导致文件以追加模式打开而不是覆盖模式。

    下面是一些可能的解决方案:

    1. 指定打开文件的方式:使用 ios::out 时,默认情况下是追加到文件末尾。要覆盖文件,您需要使用 ios::trunc 标志。这将删除文件中的内容,如果文件存在的话。

      fs.open("text/1.txt", ios::out | ios::trunc);
      
    2. 修正语法错误:将 <<end1; 改为 << endl;

    3. 检查文件路径:确保文件路径是正确的,并且程序有足够的权限来写入该文件。

    4. 确保文件句柄关闭后不再写入:在 while 循环之后关闭文件流是不正确的,因为 fswhile 循环中仍然需要使用。应该在所有写入操作完成后再关闭文件。

    5. 检查 head 指针:确保 head 指向一个有效的链表头节点。

    修正后的代码示例:

    void baocun() {
        par* p;
        p = head;
        ofstream fs;
    
        // 打开文件用于写入,如果文件已存在,则截断文件(覆盖)
        fs.open("text/1.txt", ios::out | ios::trunc);
    
        if (!fs.is_open()) {
            // 如果文件无法打开,可以在这里处理错误
            cout << "无法打开文件" << endl;
            return;
        }
    
        while (p != NULL) {
            fs << p->name << " " << p->num << " " << p->adr << endl;
            p = p->next;
        }
    
        // 关闭文件流
        fs.close();
    }
    

    确保您的 par 结构体包含 name, num, 和 adr 成员,并且 head 是链表的头指针。

    以上步骤应该能够解决您的问题,如果仍然无法覆盖文件,请检查您的文件系统权限,或者尝试在不同的目录中创建和写入文件。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月1日
  • 修改了问题 6月1日
  • 赞助了问题酬金20元 6月1日
  • 创建了问题 6月1日