C++程序生成输出文件为空,请求问题排查
问题排查与解决
核心原因:字符串匹配不成立
你的输入文件第一列是带双引号的"1",但代码里判断col1 == "1"——实际getline读取到的col1值是"\"1\""(包含首尾双引号的完整字符串),导致条件永远不满足,自然不会向输出文件写入任何内容。
修复方案
方案1:去除字符串首尾的双引号后再判断
对读取到的列值做简单处理,剥离首尾双引号:
// 处理col1,去掉首尾双引号 if (!col1.empty() && col1.front() == '"' && col1.back() == '"') { col1 = col1.substr(1, col1.size() - 2); } if (col1 == "1") { // 写入逻辑 }
方案2:直接匹配带双引号的字符串
修改判断条件,直接匹配读取到的原始值:
if (col1 == "\"1\"") { // 写入逻辑 }
其他潜在问题点
- 文件路径/权限问题:确认输入输出文件的路径是否正确,当前程序是否有读写该路径的权限。可以添加文件打开检查,快速定位问题:
if (!inputFile.is_open()) { std::cerr << "无法打开输入文件" << std::endl; return 1; } if (!outputFile.is_open()) { std::cerr << "无法打开输出文件" << std::endl; return 1; }
- 行尾格式兼容问题:如果输入文件是Windows下生成的(行尾为CRLF),在类Unix系统中可能导致
getline读取异常,但这种情况概率较低。
修复后完整代码示例
#include <fstream> #include <sstream> #include <iostream> #include <string> int main() { std::ifstream inputFile("/Users/a0p0ieu/Desktop/specRules/list.csv"); std::ofstream outputFile("/Users/a0p0ieu/Desktop/specRules/output_spec.txt"); std::string line; if (!inputFile.is_open()) { std::cerr << "无法打开输入文件" << std::endl; return 1; } if (!outputFile.is_open()) { std::cerr << "无法打开输出文件" << std::endl; return 1; } while (getline(inputFile, line)) { std::istringstream iss(line); std::string col1, col2, col3; getline(iss, col1, ','); getline(iss, col2, ','); getline(iss, col3, ','); // 剥离各列首尾的双引号 auto stripQuotes = [](std::string& s) { if (!s.empty() && s.front() == '"' && s.back() == '"') { s = s.substr(1, s.size() - 2); } }; stripQuotes(col1); stripQuotes(col2); stripQuotes(col3); if (col1 == "1") { outputFile << "\"" << col2 << "\": {\n"; outputFile << " \"#" << col3 << "\": \"onix_notificationtype.values[].value\"\n"; outputFile << "},\n"; } } inputFile.close(); outputFile.close(); return 0; }
内容的提问来源于stack exchange,提问作者Ankita Prasad
相关产品推荐
相关产品推荐

