C++读取含混合值的文本行技术求助
用C++读取含Inf的混合double值文本文件方案
嘿,我懂你现在的需求——要读取每行包含double类型值(包括Inf这类特殊值)的文本文件,而且这些值的顺序没固定规律,之前手动用分隔符分割字符串的方式肯定有点繁琐,甚至可能处理不好Inf的识别。这里给你几个更靠谱的实现思路:
方案一:直接用流提取(最省心的方式)
C的输入流本身就支持读取double类型,而且从C11开始,标准库已经能自动识别Inf这种特殊值了,完全不用手动分割字符串,代码简洁到爆:
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; int main() { const string filepath = "your_target_file.txt"; vector<double> temp; ifstream travelFile(filepath); // 先检查文件是否成功打开 if (!travelFile.is_open()) { cerr << "Error: 无法打开目标文件!" << endl; return 1; } double val; // 流提取会自动跳过空格、换行符,直接读取所有double值 while (travelFile >> val) { temp.push_back(val); } travelFile.close(); // 测试输出读取到的内容 for (double value : temp) { cout << value << " "; } cout << endl; return 0; }
方案二:逐行处理(适合需要行级逻辑的场景)
如果你必须逐行处理(比如每行需要单独做一些额外操作),那用stringstream来解析每行内容是最佳选择,同样能自动识别Inf:
#include <iostream> #include <fstream> #include <vector> #include <string> #include <sstream> using namespace std; int main() { const string filepath = "your_target_file.txt"; vector<double> temp; ifstream travelFile(filepath); if (!travelFile.is_open()) { cerr << "Error: 无法打开目标文件!" << endl; return 1; } string line; while (getline(travelFile, line)) { stringstream lineStream(line); double val; // 从当前行的字符串流中读取所有double值 while (lineStream >> val) { temp.push_back(val); } } travelFile.close(); // 测试输出 for (double value : temp) { cout << value << " "; } cout << endl; return 0; }
进阶处理:混合字符串与double的情况
如果你的文件里除了double和Inf,还混有其他普通字符串(比如非数值型的内容),那可以加个判断逻辑,区分有效数值和无效字符串:
#include <iostream> #include <fstream> #include <vector> #include <string> #include <sstream> #include <stdexcept> using namespace std; int main() { const string filepath = "your_target_file.txt"; vector<double> temp; ifstream travelFile(filepath); if (!travelFile.is_open()) { cerr << "Error: 无法打开目标文件!" << endl; return 1; } string line; while (getline(travelFile, line)) { stringstream lineStream(line); string token; while (lineStream >> token) { try { size_t parsePos; double val = stod(token, &parsePos); // 只有当整个token都被解析成double时,才加入列表 if (parsePos == token.size()) { temp.push_back(val); } else { cout << "注意:遇到非数值字符串 -> " << token << endl; } } catch (const invalid_argument&) { cout << "注意:无效的数值格式 -> " << token << endl; } catch (const out_of_range&) { cout << "注意:数值超出范围 -> " << token << endl; } } } travelFile.close(); // 测试输出 for (double value : temp) { cout << value << " "; } cout << endl; return 0; }
小提示
- 确保你的编译器开启了C++11及以上标准(现在大部分编译器默认都支持了,比如GCC加
-std=c++11或者更高版本),这样才能正确识别Inf。 - 流提取的方式会自动跳过所有空白字符(空格、制表符、换行符),不管值的顺序如何,都能准确读取。
内容的提问来源于stack exchange,提问作者leena.ahmed
相关产品推荐
相关产品推荐

