最安全做法是用std::ifstream配合std::getline读入std::vector;读数字优先用>>但需检查failbit;解析csv等格式应逐行读再用stringstream分割;务必处理编码、空行、溢出及eof误用等边界问题。

用 std::ifstream 逐行读取文本文件到数组是可行的,但“直接读到数组”这个说法容易误导——C++ 没有内置机制把整份文件自动塞进原生数组(比如 int arr[100]),必须自己控制内存、类型转换和边界。真正可靠的做法是先读到 std::vector 或动态分配内存,再按需转存。
用 std::ifstream 读取每行字符串到 std::vector<:string></:string>
这是最安全、最常用的起点。适用于纯文本、每行一条记录(如姓名、路径、配置项)的场景。
- 确保文件存在且路径正确,否则
is_open()返回false - 用
std::getline()而非>>,避免空格截断和换行符残留 - 不要预先定义固定大小数组,
std::vector自动扩容更稳妥
std::ifstream file("data.txt");
std::vector<std::string> lines;
std::string line;
while (std::getline(file, line)) {
lines.push_back(line);
}
file.close();
从文件读数字到 std::vector<int></int>(跳过非数字内容)
如果 data.txt 是类似 12 34\n56\n78 90 100 的格式,用流提取操作符 >> 更自然,但它会跳过所有空白符(包括换行),无法按行区分。
-
operator>>自动跳过前导空白,并在遇到非数字字符时停止,适合连续数字流 - 若某行含混合内容(如
ID: 42),需先读字符串再用std::stoi提取数字 - 务必检查
failbit,防止因非法字符导致后续读取静默失败
std::ifstream file("data.txt");
std::vector<int> numbers;
int x;
while (file >> x) {
numbers.push_back(x);
}
if (file.fail() && !file.eof()) {
// 可能遇到了非数字字符,需要清错并跳过
file.clear();
file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
读取固定格式数据(如 CSV 数字)到二维 std::vector
当文件是规则分隔的数值表(例如每行三个整数,用空格或逗号分隔),推荐逐行读 + 字符串分割,比依赖 >> 更可控。
立即学习“C++免费学习笔记(深入)”;
- 用
std::getline()读整行,再用std::stringstream解析该行,可精确控制每行字段数 - 对逗号分隔,可用
std::getline(ss, token, ',');空格分隔则继续用>> - 避免把整份文件一次性读入
char[]再手动解析——易越界、难调试、无类型安全
std::ifstream file("data.txt");
std::vector<std::vector<int>> matrix;
std::string line;
while (std::getline(file, line)) {
std::stringstream ss(line);
std::vector<int> row;
int val;
while (ss >> val) {
row.push_back(val);
}
if (!row.empty()) matrix.push_back(row);
}
真正麻烦的地方不在“怎么读”,而在“读错了怎么办”。比如文件编码不是 UTF-8(Windows 记事本默认 ANSI)、末尾多一个空行、某数字超出 int 范围却没检查溢出、或者用 .eof() 做循环条件导致最后一行重复处理——这些细节不显眼,但会让程序在特定文件上突然崩溃或结果错乱。









