C++ fstream写入int读取string正常,底层是否存在类型转换?
问题描述
我正在学习C++的文件读写操作,遇到一个疑惑:将5个int类型整数写入ages.txt文件后,使用read_file()函数以string类型读取并输出到控制台,数字能被正确读取。这是否意味着底层存在类型转换?另外,将read_file()中的读取类型改为char时,控制台输出会将每个数字拆分为单个字符,输出内容如下:
File was opened
1
2
1
3
1
4
1
5
1
6
我的代码如下:
#include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; void read_file() { ifstream file ("ages.txt"); vector<string> read_age; string input; while(file >> input) { read_age.push_back(input); } for(string age : read_age) { cout << age << endl; } } int main() { ofstream file ("ages.txt"); if(file.is_open()) { cout << "File was opened" << endl; } vector<int> ages; ages.push_back(12); ages.push_back(13); ages.push_back(14); ages.push_back(15); ages.push_back(16); for(int age : ages) { file << age << endl; } read_file(); return 0; }
解答
1. string读取为何能正确显示?
你写入文件时用的是文本模式(默认打开方式),file << age会把int类型的数值转换成对应的ASCII字符序列写入文件。比如int的12会被转成字符'1'和'2',再加上换行符。所以文件里存的不是二进制的int数据,而是纯文本字符。
当你用file >> input(input为string类型)读取时,>>运算符会按空白符(空格、换行、制表符等)分割文本,把连续的非空白字符作为一个完整的string读取。文件中每一行的"12"、"13"等都是连续的非空白字符,因此会被完整读取成对应的string。这不是什么“底层类型转换”,只是读取了文件里的文本字符,刚好和你写入的数字文本一致。
2. char读取为何拆分单个字符?
当读取类型改为char时,file >> input(input为char类型)会逐个读取文件中的非空白字符(自动跳过换行、空格等空白符)。你的文件内容实际是:
12\n13\n14\n15\n16\n
(\n代表换行符)
跳过所有换行符后,读取顺序就是'1'、'2'、'1'、'3'、'1'、'4'、'1'、'5'、'1'、'6',所以控制台会逐个输出这些字符,就出现了你看到的结果。
额外说明
如果想直接写入int的二进制数据(而非文本),需要在打开文件时指定ios::binary模式,并用write方法写入:
ofstream file("ages.txt", ios::binary); file.write(reinterpret_cast<const char*>(&age), sizeof(int));
这种情况下,用string或char读取会得到乱码,因为读取的是二进制原始数据,不是可读的文本字符。
内容的提问来源于stack exchange,提问作者jakarta_tea

