You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ fstream文件读写问题:Todo App无法处理带空格内容

解决Todo应用无法读写带空格内容的问题

问题根源在于cin >> input的默认行为:它会以**空白字符(空格、换行、制表符)**作为输入结束标志,输入"hello world"时只会读取第一个空格前的"hello",剩余内容留在输入缓冲区,导致读写不完整。

以下是修复后的代码,同时优化了文件操作的健壮性:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    bool running = true;
    string input;
    string output;

    while (running) {
        cout << "What would you like to do (type 'help' for help)  \n";
        cin >> input;
        // 清除cin读取命令后残留的换行符,避免后续getline读到空内容
        cin.ignore();

        // 帮助功能
        if (input == "help") {
            cout << "  Adding a todo(add) \n  Removing a todo(remove) \n  Viewing Todos(view)  \n  Killing the program(exit0)\n";
        }
        // 退出程序
        else if (input == "exit0") {
            return 0;
        }
        // 添加待办
        else if (input == "add") {
            // 以追加模式打开文件,避免覆盖已有内容
            ofstream writer("todo.txt", ios::app);
            if (!writer) {
                cout << "Failed to open file!" << endl;
                continue;
            }
            cout << "What is your todo/note for today \n";
            // 使用getline读取包含空格的完整内容
            getline(cin, input);
            writer << input << endl;
            writer.close();
            cout << "Todo added successfully!" << endl;
        }
        // 查看待办
        else if (input == "view") {
            ifstream reader("todo.txt");
            if (!reader) {
                cout << "Todo file doesn't exist or can't be opened!" << endl;
                continue;
            }
            cout << "\nCurrent Todos:\n";
            while (getline(reader, output)) {
                cout << "- " << output << endl;
            }
            reader.close();
        }
        // 未知命令处理
        else {
            cout << "Unknown command, type 'help' for available options." << endl;
        }
    }
    return 0;
}

关键修改说明:

  • 用getline(cin, input)替代cin >> input,实现包含空格的完整内容读取;每次用cin读取命令后,调用cin.ignore()清除输入缓冲区的换行符,避免getline读取空内容。
  • 拆分文件操作:添加待办用ofstream以追加模式(ios::app)打开,防止覆盖已有数据;查看待办用ifstream只读打开,符合操作语义。
  • 增加文件打开失败的判断,提升程序容错性。
  • 优化交互提示,让操作反馈更清晰。

内容的提问来源于stack exchange,提问作者MikoBest4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:43:22