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

C++ fstream写入int读取string正常,底层是否存在类型转换?

C++文件读写类型读取疑问解答

问题描述

我正在学习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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:29:54