当前位置: 首页 > news >正文

C++ 的 输入输出流(I/O Streams)

什么是输入输出流

        C++ 的输入输出操作是通过 流(stream) 机制实现的。

        流——就是数据的流动通道,比如:
        输入流:从设备(如键盘、文件)读取数据 → 程序
        输出流:程序将数据写入设备(如屏幕、文件)
        
        常用的 I/O 流对象:
        
        头文件                        类                        说明
        <iostream>                 cin                       标准输入流(默认连接键盘)
        <iostream>                 cout                     标准输出流(默认连接屏幕)
        <iostream>                 ceer                     标准错误流(无缓冲)
        <fstream>                   ifstream               文件输入流
        <fstream>                   ofstream              文件输出流
        <fstream>                   fstream                文件读写流
        <sstream>                  stringstream        字符串流(读写字符串)

        使用cin和cout

#include <iostream>
using namespace std;
int main()
{string name;int age;cout << "请输入你的名字:";cin >> name;cout << "请输入你的年龄:";cin >> age;cout << "你好," << name << ",你今年 " << age << " 岁。" << endl;return 0;
}

        需要解释的建议转专业;

        注意:

        cin >> 是以空格为分隔符,遇空格就停止。

        如果你想读取带空格的一整行,请用 getline():
         getline(cin, name); // 读取整行,包括空格

        文件的输入和输出:ifstream/ofstream

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
// 写入文件ofstream fout("data.txt");fout << "Hello, file!" << endl;fout << "C++ 文件操作示例" << endl;fout.close();
// 读取文件ifstream fin("data.txt");string line;while (getline(fin, line)){cout << "读到: " << line << endl;}fin.close();return 0;
}

        文件写入操作

// 写入文件
ofstream fout("data.txt");
fout << "Hello, file!" << endl;
fout << "C++ 文件操作示例" << endl;
fout.close();

        ofstream fout("data.txt");创建一个 ofstream 对象 fout,并且将其与文件 data.txt 关联起来ofstream 用于向文件写入数据。若文件不存在,会创建该文件;若文件已存在,会清空原有内容。

  fout << "Hello, file!" << endl; 和 fout << "C++ 文件操作示例" << endl;:向文件 data.txt 写入两行内容,endl 用于换行。

  fout.close();:关闭文件,释放与文件关联的资源。

        文件读取操作

// 读取文件
ifstream fin("data.txt");
string line;
while (getline(fin, line))
{cout << "读到: " << line << endl;
}
fin.close();

        ifstream fin("data.txt");创建一个 ifstream 对象 fin,并将其与文件 data.txt 关联起来ifstream 用于从文件读取数据

  string line;:定义一个 string 类型的变量 line,用于存储从文件中读取的每一行内容。

  while (getline(fin, line))使用 getline 函数从文件中逐行读取内容每次读取一行并存储到 line 变量中getline 函数在读取到文件末尾时会返回 false,循环结束。

  cout << "读到: " << line << endl;:将读取到的每一行内容输出到控制台。

  fin.close();:关闭文件,释放与文件关联的资源。

        注:在 C++ 里,使用 ofstream 或 ifstream 创建对象时不指定文件打开方式是可行的。

        ofstream 默认的打开方式

        使用 ofstream 类创建对象并关联文件,却不明确指定打开方式时,ofstream 会采用默认的打开方式。默认情况下,ofstream 以 ios::out | ios::trunc 模式打开文件。

        ios::out:表明以输出模式打开文件,也就是用于向文件写入数据

  ios::trunc:意味着如果文件已经存在,会先把文件内容清空,再进行写入操作;若文件不存在,则会创建该文件

        手动指定打开方式

        若有特殊需求,也能手动指定文件的打开方式。ofstream 类的构造函数可以接收第二个参数,用于指定打开方式

        字符串流:stringstream

#include <iostream>
#include <sstream>
using namespace std;
int main()
{string input = "42 3.14 hello";stringstream ss(input);int i;double d;string s;ss >> i >> d >> s;cout << "Integer: " << i << ", Float: " << d << ", String: " << s << endl;return 0;
}

        头文件

#include <iostream>
#include <sstream>

        #include <sstream>:该头文件引入了 stringstream 类stringstream 类能够将字符串当作流来处理,可进行字符串的输入和输出操作

        定义输入字符串并创建 stringstream 对象

string input = "42 3.14 hello";
stringstream ss(input);

        string input = "42 3.14 hello"; 定义了一个字符串 input,其中包含一个整数、一个浮点数和一个字符串,它们之间用空格分隔。

  stringstream ss(input); 创建了一个 stringstream 对象 ss,并将字符串 input 作为初始内容这样 ss 就可以像处理输入流一样处理这个字符串

        定义变量并从 stringstream 中提取数据

int i;
double d;
string s;
ss >> i >> d >> s;

        int i;double d; 和 string s;:分别定义了一个整数变量 i、一个双精度浮点数变量 d 和一个字符串变量 s用于存储从 stringstream 中提取的数据

  ss >> i >> d >> s;:使用 >> 运算符从 stringstream 对象 ss 中依次提取数据并将其存储到对应的变量中>> 运算符会根据变量的类型自动进行类型转换。在这个例子中,它会先将字符串中的第一个整数 "42" 转换为整数类型并存储到 i 中,接着将第二个浮点数 "3.14" 转换为双精度浮点数类型并存储到 d 中,最后将剩余的字符串 "hello" 存储到 s 中

        ids 的顺序不是绝对不能换,交换顺序后,代码的执行结果会依赖于 stringstream 对象 ss 中存储的字符串内容。如果字符串内容的顺序与变量类型的提取顺序不匹配,就可能导致提取失败或者得到不符合预期的结果。

        注:

        stringstream 类的介绍

        stringstream 是 C++ 标准库 <sstream> 头文件中定义的类,它继承自 iostream 类,结合了 istream(输入流)和 ostream(输出流)的功能,允许你像操作文件流或标准输入输出流一样操作字符串。stringstream 主要有以下三个子类:

        istringstream:用于从字符串中读取数据,相当于输入流。

  ostringstream:用于向字符串中写入数据,相当于输出流。

  stringstream:既可以读取也可以写入字符串,兼具前两者的功能。

        stringstream 对象的初始化

        stringstream 对象不一定要接受一个 string 类对象来初始化。

        使用 string 对象初始化
#include <iostream>
#include <sstream>
#include <string>int main() {std::string input = "42 3.14 hello";std::stringstream ss(input);return 0;
}

        stringstream 对象 ss 被初始化为包含字符串 "42 3.14 hello"

        默认初始化
#include <iostream>
#include <sstream>int main() {std::stringstream ss;ss << "This is a test";return 0;
}

        这里先默认初始化了 stringstream 对象 ss,之后可以使用 << 运算符向其写入数据

        >> 运算符能从 stringstream 对象中提取对应类型数据的原理

        >> 运算符是 C++ 中用于输入流操作的提取运算符。当它用于 stringstream 对象时,其工作原理基于 C++ 的流操作和类型转换机制。

        流操作

        stringstream 是一个流对象,>> 运算符会从流中读取数据。它会按照空格、制表符或换行符等空白字符来分割流中的内容,每次提取一个 “词”(token)。

        类型转换

        当 >> 运算符遇到不同类型的变量时会尝试将读取到的字符串数据转换为该变量的类型。这是通过 C++ 的流库中预定义的类型转换函数实现的

        整数类型:当目标变量是整数类型(如 int)时,>> 运算符会尝试将读取到的字符串转换为整数。如果字符串包含有效的整数字符序列,就会成功转换;否则会导致流状态错误。

#include <iostream>
#include <sstream>int main() {std::string input = "42";std::stringstream ss(input);int num;ss >> num;std::cout << "Integer: " << num << std::endl;return 0;
}

        >> 运算符将字符串 "42" 转换为整数 42 并存储到 num 中。
        浮点数和它一样操作;

        

  • 字符串类型:当目标变量是 std::string 类型时,>> 运算符会读取直到遇到下一个空白字符为止的字符串。
    #include <iostream>
    #include <sstream>
    #include <string>int main() {std::string input = "hello world";std::stringstream ss(input);std::string word;ss >> word;std::cout << "String: " << word << std::endl;return 0;//仅仅输出“hello”
    }

            >> 运算符读取到 "hello" 就停止了,因为遇到了空格,所以 word 被赋值为 "hello"

        I/O常见技巧:

        读取整行:              getline(cin,str)
        清除输入缓冲:       cin.ignore()或 cin.clear()
        判断文件是否打开:fin.is_open()
        检查流状态:           cin.fail()、fin.eof()

        小结

        标准流(cin,cout,cerr):控制台输入输出
        文件流(ifstream/ofstream/fstream):文件读写
        字符串流(stringstream):字符串格式转换

        流格式控制:设置小数位、对齐等

        C++ 使用 <iomanip> 头文件提供了一系列 格式控制操作符

        常见格式控制符:(省略std::)

        fixed:使用固定小数位表示法
        scientific:科学计数法
        setprecision(n):设置小数位保留精度
        setw(n):设置输出字符串宽度
        left/right/internal:设置对齐方式
        setfill(c):设置填充字符
        showpos:显示正号(+)

        格式化数字输出

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{double pi = 3.141592653;cout << "Default Output: " << pi << endl;cout << fixed << setprecision(3);cout << "Round to 3 decimal places: " << pi << endl;cout << setw(10) << right << setfill('*') << 42 << endl;// 右对齐,宽度 10,用 * 填充return 0;
}

        输出保留三位小数的pi值

cout << fixed << setprecision(3);
cout << "Round to 3 decimal places: " << pi << endl;

        cout << fixed << setprecision(3);
        fixed 是一个操纵符,它会让浮点数以固定点表示法输出,也就是小数点后的位数固定

  setprecision(3) 同样是一个操纵符,它指定了输出浮点数时小数点后的位数为 3这两个操纵符结合使用,就能让后续输出的浮点数保留三位小数

        右对齐输出整数并填充字符

cout << setw(10) << right << setfill('*') << 42 << endl;

        setw(10):这是一个操纵符,它设置了下一个输出项宽度为 10 个字符。如果输出项的实际宽度小于 10 个字符,就会按照指定的填充字符进行填充。

  right:这是一个操纵符,它指定输出项右对齐

  setfill('*'):这是一个操纵符,它指定了填充字符为 *

  42 是要输出的整数。综合起来,这段代码会以右对齐的方式输出整数 42,宽度为 10 个字符,不足的部分用 * 填充,输出结果为 ********42

        中文字符流(UTF-8 / 宽字符)

        中文字符通常需要用 宽字符(wchar_t)+ 宽流(wcout/wcin) 或确保控制台支持 UTF-

8 编码

        宽字符流输出中文(Windows 下推荐)

#include <iostream>
#include <locale>
using namespace std;
int main()
{
// 设置全局 locale,使 wcout 能输出中文
//(Windows 使用 "chs" 或 "zh_CN.UTF-8")locale::global(locale(""));wcout << L"Hello, World" << endl;return 0;
}
        头文件
#include <iostream>
#include <locale>

        #include <iostream>:这是标准输入输出流的头文件,借助它可以使用 coutwcoutcin 等标准输入输出对象。

   #include <locale>:该头文件提供了处理区域设置的功能,能让程序适配不同地区的语言、货币、日期格式等

        设置全局区域设置
locale::global(locale(""));

        locale::global 函数用于设置全局的区域设置

  locale("") 代表使用系统默认的区域设置。在 Windows 系统中,这可能会使用 "chs" 或者 "zh_CN.UTF - 8",从而确保程序能正确处理中文等宽字符。

        输出宽字符字符串
wcout << L"Hello, World" << endl;

        wcout 是用于输出宽字符标准输出流对象

   L"Hello, World" 是宽字符字符串,以 L 作为前缀表明其中的每个字符是宽字符类型(通常是 wchar_t)。

        封装文件读写成类

        将文件 I/O 封装成类能提升代码复用性与清晰度,特别适合数据处理类。        

        封装为 FileManager 类

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class FileManager
{
public:FileManager(const string& fname) : filename(fname) {}void writeLine(const string& text){ofstream fout(filename, ios::app); // 追加写入if (fout.is_open()){fout << text << endl;fout.close();}else{cerr << "无法打开文件用于写入!" << endl;}}void readAll() const{ifstream fin(filename);if (fin.is_open()){string line;while (getline(fin, line)){cout << "读到: " << line << endl;}fin.close();}else{cerr << "无法打开文件用于读取!" << endl;}}
private:string filename;
};
int main()
{FileManager file("data.txt");file.writeLine("你好,文件!");file.writeLine("C++ 文件封装测试。");file.readAll();return 0;
}
        writeLine 方法
void writeLine(const string& text)
{ofstream fout(filename, ios::app); // 追加写入if (fout.is_open()){fout << text << endl;fout.close();}else{cerr << "无法打开文件用于写入!" << endl;}
}
  • 功能:该方法用于向文件中追加一行文本
  • 实现步骤
    1. 创建一个 ofstream 对象 fout,并以追加模式(ios::app打开指定的文件。
    2. 检查文件是否成功打开,如果成功,则将传入的文本 text 写入文件,并在末尾添加换行符 endl
    3. 关闭文件流。
    4. 如果文件无法打开,则使用 cerr 输出错误信息(这里也可以换成cout,但cerr本身就是专门用来输出错误信息的。
        readall方法
void readAll() const
{ifstream fin(filename);//上面那一步就等同于://ifstream fin;//fin.open(filename);//省略掉了使用open()函数if (fin.is_open()){string line;while (getline(fin, line)){cout << "读到: " << line << endl;}fin.close();}else{cerr << "无法打开文件用于读取!" << endl;}
}
  • 功能:该方法用于读取文件中的所有行,并将每行内容输出到控制台
  • 实现步骤
    1. 创建一个 ifstream 对象 fin并打开指定的文件
    2. 检查文件是否成功打开,如果成功,则使用 getline 函数逐行读取文件内容,直到文件结束。
    3. 对于每一行,将其输出到控制台,并在前面加上提示信息 “读到:”。
    4. 关闭文件流。
    5. 如果文件无法打开,则使用 cerr 输出错误信息

注:

        cerr和cout的区别

        缓冲机制
  • coutcout 是带有缓冲的输出流。这意味着当你向 cout 输出数据时,数据会先被存储在缓冲区里,等缓冲区满了或者遇到特定的刷新条件(像遇到 endl、调用 flush() 函数或程序结束return 0 的时候直接刷新等),才会将数据输出到对应的设备(一般是控制台)
  • cerrcerr 是无缓冲的输出流一旦你向 cerr 输出数据,数据会立刻被输出到对应的设备,不会进行缓冲。这种特性使得 cerr 适合用于输出错误信息,因为在程序出错时,你希望错误信息能马上显示出来,而不是等到缓冲区满了才显示。
        用途
  • cout:通常用于输出程序的正常运行结果。比如在计算并输出一些数据、显示提示信息等场景下使用。
  • cerr专门用于输出程序运行过程中出现的错误信息。使用 cerr 可以让错误信息和正常输出区分开来,方便调试和监控程序。
        输出目标
  • cout:默认情况下,cout 的输出目标标准输出设备,一般是控制台。不过,你可以通过重定向操作将其输出到文件或者其他设备。
  • cerr:默认情况下,cerr 的输出目标标准错误输出设备,同样通常是控制台。和 cout 不同的是,cerr 的输出不会被重定向操作影响,它始终会输出到标准错误输出设备,这样能确保错误信息不会被误重定向到其他地方。

        小结

        技术点:核心语法/类       场景

        格式流控制:<iomanip>    小数精度、对齐、美观输出
        中文字符流:wcout,L"",locale  终端/日志中正确输出中文
        文件操作封装:自定义类+ifstream/ofstream  实现面向对象的数据存取方式

        stringstream 实现类型转换、如何读写二进制文件 (ios::binary)

        使用 stringstream 实现类型转换

        stringstream 是一个灵活的字符串流工具,能像输入输出流一样操作字符串。

        当你创建一个 stringstream 对象后,就可以使用 << 运算符向这个对象里插入数据,也能使用 >> 运算符从这个对象中提取数据

        主要来自头文件 <sstream> 这个头文件提供了  stringstream 类,它能让你像操作标准输入输出流(如  cin 和  cout)一样对字符串进行操作,从而 实现字符串和其他数据类型之间的转换  
场景:
把字符串转成数字(如 "123" -> 123)
把数字转成字符串(如 3.14 -> "3.14")
        

        字符串 数字转换

#include <iostream>
#include <sstream>
using namespace std;
int main()
{string str = "42.5";double num;stringstream ss(str);ss >> num;cout << "字符串转数字: " << num << endl;int i = 100;stringstream ss2;ss2 << i;string s = ss2.str();cout << "数字转字符串: " << s << endl;return 0;
}
        字符串转数字
string str = "42.5";
double num;
stringstream ss(str);
ss >> num;
cout << "字符串转数字: " << num << endl;
  • stringstream 对象创建与初始化
    • stringstream ss(str);:创建一个 stringstream 对象 ss,并使用字符串 str 对其进行初始化。这意味着 ss 中包含了字符串 "42.5"(这种类似构造函数的初始化只能是字符串类型,不能是int、double等类型,没有对应的构造函数)。
  • 字符串转换为数字
    • ss >> num;:使用输入运算符 >> 从 stringstream 对象 ss 中读取数据,并尝试将其转换为 double 类型,然后存储到变量 num 中。这里 "42.5" 被成功转换为 42.5(注意必须用stringstream类型的对象来转化为其他类型的对象,不能直接转化,必须用stringstream当跳板)

        数字转字符串

int i = 100;
stringstream ss2;
ss2 << i;
string s = ss2.str();
cout << "数字转字符串: " << s << endl;
  • stringstream 对象创建
    • stringstream ss2;:创建一个空的 stringstream 对象 ss2。(这是因为stringstream类型的对象不能直接被int类型初始化,没有这个构造函数,必须分成两步)
  • 数字写入 stringstream 对象
    • ss2 << i;:使用输出运算符 << 将整数 i 的值写入 stringstream 对象 ss2 中。此时 ss2 中存储了表示 100 的字符串。
       
    • 使用 << 运算符将一个 int 类型的变量 i(这里 i 的值为 100)插入到 stringstream 对象 ss2 中时,100 会以字符串的形式存储在 ss2 里
  • 获取 stringstream 中的字符串
    • string s = ss2.str();调用 str() 方法从 stringstream 对象 ss2 中获取存储的字符串,并将其赋值给字符串变量 s

        注:

        str() 方法的功能

        stringstream 类提供了一个名为 str() 成员函数,其作用是获取 stringstream 对象当前存储的字符串内容。这个方法返回一个 std::string 类型的对象,该对象包含了 stringstream 中存储的所有字符

        string s = ss2.str(); 的执行过程

  • 调用 ss2.str()ss2 是 stringstream 对象调用它的 str() 方法,会返回一个 std::string 对象,这个对象包含了 ss2 中当前存储的字符串 "100"(100以字符串的形式被存储)。
  • 赋值操作:把 ss2.str() 返回的 std::string 对象赋值给字符串变量 s。经过这一步,变量 s 就存储了 "100" 这个字符串。
替代用法(C++11 起):
std:: stoi(str) 、std:: stod(str) 字符串转 int/double
std:: to_string(num) 数字转字符串
但 stringstream 更灵活,可用于复杂结构和格式化场景。

        读写二进制文件 (ios::binary)

#include <iostream>
#include <fstream>
using namespace std;
struct Person
{char name[20];int age;
};
int main()
{
// 写入ofstream fout("people.dat", ios::binary);Person p1 = {"Alice", 25};Person p2 = {"Bob", 30};fout.write(reinterpret_cast<char*>(&p1), sizeof(p1));fout.write(reinterpret_cast<char*>(&p2), sizeof(p2));fout.close();
// 读取ifstream fin("people.dat", ios::binary);Person p;while (fin.read(reinterpret_cast<char*>(&p), sizeof(p))){cout << "Name: " << p.name << ", Age: " << p.age << endl;}fin.close();return 0;
}

        写入部分

ofstream fout("people.dat", ios::binary);
Person p1 = {"Alice", 25};
Person p2 = {"Bob", 30};
fout.write(reinterpret_cast<char*>(&p1), sizeof(p1));
fout.write(reinterpret_cast<char*>(&p2), sizeof(p2));
fout.close();

        ios::binary:是一个文件打开模式标志,表示以二进制模式打开文件。在二进制模式下,数据会以字节形式直接写入文件,不进行额外的字符转换(如换行符转换),这对于存储结构体等二进制数据非常重要。

fout.write(reinterpret_cast<char*>(&p1), sizeof(p1));
fout.write(reinterpret_cast<char*>(&p2), sizeof(p2));
  • fout.write() 是 ofstream 类的成员函数,用于将指定数量的字节写入文件
  • reinterpret_cast<char*>(&p1) 和 reinterpret_cast<char*>(&p2)
    • &p1 和 &p2 分别是 p1 和 p2 结构体对象的地址
    • reinterpret_cast<char*> 是 C++ 中的强制类型转换操作符,它将结构体对象的地址转换为 char* 类型。这是因为 write 函数要求第一个参数是 char* 类型的指针,指向要写入的数据的起始地址
  • sizeof(p1) 和 sizeof(p2)sizeof 是 C++ 的一个操作符,用于获取对象或类型所占用的字节数(这里是对象,不是地址)。这里 sizeof(p1) 和 sizeof(p2) 分别表示 p1 和 p2 结构体对象的大小,即要写入文件的字节数。

        读取部分

ifstream fin("people.dat", ios::binary);
Person p;
while (fin.read(reinterpret_cast<char*>(&p), sizeof(p)))
{cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
fin.close();

        定义一个 Person 结构体的对象 p,用于存储从文件中读取的数据。

while (fin.read(reinterpret_cast<char*>(&p), sizeof(p)))
{cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
  • fin.read() 是 ifstream 类的成员函数,用于从文件中读取指定数量的字节到指定的内存地址
  • reinterpret_cast<char*>(&p):将 p 结构体对象的地址转换为 char* 类型,作为 read 函数的第一个参数,表示读取的数据要存储的起始地址
  • sizeof(p):表示要从文件中读取的字节数,即一个 Person 结构体对象的大小。
  • while (fin.read(...))read 函数在成功读取指定数量的字节时返回 fin 对象本身,在布尔上下文中,fin 对象会被转换为 bool 类型,如果读取成功则为 true,如果遇到文件结束符(EOF)或读取错误则为 false。因此,这个 while 循环会不断读取文件,直到文件结束。
  • 在循环体中,使用 cout 输出从文件中读取的 p 结构体对象的 name 和 age 成员。

注:

        结构体的内存布局

        Person 结构体的定义如下:

struct Person
{char name[20];int age;
};

        在内存中,结构体的成员是连续存储的。name 数组占据前 20 个字节,age 这个 int 类型的成员接着存储在 name 之后,一般 int 类型在常见的系统上占 4 个字节。所以,Person 结构体的总大小(sizeof(Person))通常是 24 个字节(20 字节的 name 数组加上 4 字节的 age)。

        数据读取过程

Person p;
while (fin.read(reinterpret_cast<char*>(&p), sizeof(p)))
{cout << "Name: " << p.name << ", Age: " << p.age << endl;
}
  • 定义一个 Person 结构体的对象 p,用于存储从文件中读取的数据,读出来的数据就存储在了这个定义的p中。
  • reinterpret_cast<char*>(&p):把 p 这个 Person 结构体对象的地址强制转换为 char* 类型。这是因为 read 函数要求第一个参数是 char* 类型的指针指向数据要存储的起始地址
  • sizeof(p)确定要从文件中读取的字节数,这里是 Person 结构体的大小read 函数会从文件中读取 sizeof(p) 字节的数据,然后把这些数据依次存放到 p 结构体对象的内存空间里
  • 由于结构体成员在内存中是连续存储的,文件中的前 20 个字节会被存到 p.name 数组中,接下来的 4 个字节会被存到 p.age 中。这样,文件中的二进制数据就和 p 结构体的成员一一对应起来了。

小贴士

写二进制:write(reinterpret_cast<char*>(&obj),sizeof(obj) )
读二进制:read(reinterpret_cast<char*>(&obj),sizeof(obj))
必须用reinterpret_cast因为write/read操作的是char*指针
结构体对齐注意 :添加 #pragma pack(1) 或 alignas(1) 以避免字节填充问题

小结

字符串转数字 stringstream, std::stoi          用户输入处理、配置读取
std::stoi(str)、std::stod(str):字符串转 int/double
#include <iostream>
#include <string>using namespace std;int main() {string intStr = "123";string doubleStr = "3.14";int num = stoi(intStr);double dNum = stod(doubleStr);cout << "字符串 \"" << intStr << "\" 转 int 结果: " << num << endl;cout << "字符串 \"" << doubleStr << "\" 转 double 结果: " << dNum << endl;return 0;
}    

用法示例;

数字转字符串 stringstream, std::to_string      日志打印、格式化输出
std::to_string(num):数字转字符串
二进制文件读写 ios::binary + write/read
保存结构体、图像、模型参数等数据

相关文章:

C++ 的 输入输出流(I/O Streams)

什么是输入输出流 C 的输入输出操作是通过 流&#xff08;stream&#xff09; 机制实现的。 流——就是数据的流动通道&#xff0c;比如&#xff1a; 输入流&#xff1a;从设备&#xff08;如键盘、文件&#xff09;读取数据 → 程序 输出流&#xff1a;程序将数据写入设备&…...

Java 安全:如何防止 SQL 注入与 XSS 攻击?

Java 安全&#xff1a;如何防止 SQL 注入与 XSS 攻击&#xff1f; 在 Java 开发领域&#xff0c;安全问题至关重要&#xff0c;而 SQL 注入和 XSS 攻击是两种常见的安全威胁。本文将深入探讨如何有效防止这两种攻击&#xff0c;通过详细代码实例为您呈现解决方案。 一、SQL 注…...

leetcode day36 01背包问题 494

494 目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添加 - &…...

31Calico网络插件的简单使用

环境准备&#xff1a; 1、删除Flannel 2、集群所有node节点拉取所需镜像&#xff08;具体版本可以依据calico.yaml文件中&#xff09;&#xff1a; docker pull calico/cni:v3.25.0 docker pull calico/node:v3.25.0 docker pull calico/kube-controllers:v3.25.0一、安装Cali…...

进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程

进阶篇 第 5 篇&#xff1a;现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中&#xff0c;我们深入研究了经典的时间序列统计模型&#xff0c;如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛&#xff0c;但有…...

实用生活c语言脚本

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> // 清理临时文件目录 void clean_temp_directory() { const char* temp_dir "/tmp"; // 可自定义需要清理的目录 char command[1024]; …...

从零开始构建微博爬虫与数据分析系统

从零开始构建微博爬虫与数据分析系统 引言 社交媒体平台蕴含着海量的信息和数据&#xff0c;通过对这些数据的收集和分析&#xff0c;我们可以挖掘出有价值的见解。本文将详细介绍如何构建一个完整的微博爬虫和数据分析系统&#xff0c;从数据爬取、清洗、到多维度分析与可视…...

417. 太平洋大西洋水流问题

题目 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &#xff0c; heights…...

chili3d调试笔记8 打印零件属性

无效&#xff0c; 返回的是节点不是坐标啥的&#xff0c; 找他的属性 把document和selectednote&#xff08;空集&#xff09;传给handleshowproperty方法 怎么获得selectnotes和selectnotes的property值 有selectnotes运行这段就行了 明天再搞...

uniapp Vue2升级到Vue3,并发布到微信小程序的快捷方法

目录 前言&#xff1a;升级项目的两种方式步骤一、新建项目 【选择-默认模版】二、修改-pages.json三、补充-缺少的文件四、修改-Main.js按照 [官方文档-vue2升级vue3迁移指南](https://uniapp.dcloud.net.cn/tutorial/migration-to-vue3.html) 修改 五、升级-uni-ui扩展组件的…...

火山RTC 5 转推CDN 布局合成规则

实时音视频房间&#xff0c;转推CDN&#xff0c;文档&#xff1a; 转推直播--实时音视频-火山引擎 一、转推CDN 0、前提 * 在调用该接口前&#xff0c;你需要在[控制台](https://console.volcengine.com/rtc/workplaceRTC)开启转推直播功能。<br> * 调…...

Mujoco xml < sensor>

< sensor> jointposjointveljointactuatorfrcframequatgyroaccelerometerframeposframelinveltouchobjtype"site" objname"imu" 和site"imu"的区别python中与sensor有关的写法传感器名字索引第几个idid索引传感器名字传感器数量sensor中的…...

示例:spring xml+注解混合配置

以下是一个 Spring XML 注解的混合配置示例&#xff0c;结合了 XML 的基础设施配置&#xff08;如数据源、事务管理器&#xff09;和注解的便捷性&#xff08;如依赖注入、事务声明&#xff09;。所有业务层代码通过注解简化&#xff0c;但核心配置仍通过 XML 管理。 1. 项目结…...

同样的html标记,不同语言的文本,显示的字体和粗细会不一样吗

同样的 HTML 标记&#xff0c;在不同语言的文本下&#xff0c;显示出来的字体和粗细确实可能会不一样&#xff0c;原因如下&#xff1a; &#x1f30d; 不同语言默认字体不同 浏览器字体回退机制 CSS 里写的字体如果当前系统不支持&#xff0c;就会回退到下一个&#xff0c;比如…...

Linux进程6-alarm闹钟定时终止、raise发送信号、abort终止、pause挂起进程验证

目录 1.alarm函数 1.1关键点 1.2单个alarm函数定时 1.3两个alarm函数定时 2.raise函数 2.1核心行为‌ 2.2 raise与 kill 的区别 2.3程序&#xff1a; 3.abort函数 4.pause 函数 4.1 pause简单挂起 4.2父进程挂起&#xff0c;子进程发信号 1.alarm函数 函数原型&…...

SpringCloud组件—Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目&#xff0c;需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源&#xff0c;具体实现的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…...

类加载器与jvm的内存

1. 类加载器与内存的关系 类加载器的字节码放在方法区&#xff08;元空间&#xff09;中&#xff0c;同时类加载器加载类后类的信息&#xff08;成员变量、成员方法及修饰符等&#xff09;存放在方法区中。类的信息所占内存的回收要同时满足两个条件&#xff1a;类的实例被回收…...

【C++】新手入门指南(下)

文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南&#xff08;上&#xff09;&#xff0c;继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…...

el-table中el-input的autofocus无法自动聚焦的解决方案

需求 有一个表格展示了一些进度信息&#xff0c;进度信息可以修改&#xff0c;需要点击进度信息旁边的编辑按钮时&#xff0c;把进度变为输入框且自动聚焦&#xff0c;当鼠标失去焦点时自动请求更新接口。 注&#xff1a;本例以vue2 element UI为例 分析 这个需求看着挺简单…...

vimplus 如何修改语言支持的版本,以及如何跳转路径

vimplus修改语言版本 默认的vimplus支持c的版本是17 如何修改我们需要修改.ycm_extra_conf.py文件&#xff0c;这个文件管理了我们的插件配置 找到 把他修改为你想要的版本 增添路径 把你安装的gcc位置提供给他&#xff0c;默认的目前比较老 这里都是他提前为我们准备的路…...

麒麟V10安装MySQL8.4

1、下载安装包 wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar2、解压 mkdir -p /opt/mysql tar -xvf mysql-8.4.5-1.el7.x86_64.rpm-bundle.tar -C /opt/mysql3、安装MySQL 3.1、卸载mariadb rpm -qa | grep mariadb rpm -e m…...

Varjo-XR3在UE5中,头显中间有一个方块一直显示

深色方块显示在屏幕中间的焦点区域中 屏幕中间的对焦区域中显示的黑色方块。 黑色方块是一个已知问题。它在 Varjo VRTemplate 中不可见&#xff0c;因为它使用具有推荐 VR 设置的前向渲染方法。 但是&#xff0c;如果你将延迟渲染方法与高级功能&#xff08;如 Lumen、Nani…...

FastText 模型文本分类实验:从零到一的实战探索

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;文本分类是一个基础而重要的任务&#xff0c;广泛应用于情感分析、主题识别、垃圾邮件过滤等多个场景。最近&#xff0c;我参与了一次基于 FastText 模型的文本分类实验&#xff0c;从数据预处理到模型构建、训练和评…...

不同经营性道路运输从业资格证申请条件全解析

在道路运输领域&#xff0c;获取相应的从业资格证是合法从事经营性运输工作的关键前提。不同类型的运输业务&#xff0c;如旅客运输、货物运输以及危险货物运输&#xff0c;对从业者有着不同的条件要求。 经营性道路旅客运输驾驶员 驾驶证年限&#xff1a;需取得相应的机动车…...

WHAT - 静态资源缓存穿透

文章目录 1. 动态哈希命名的基本思路2. 具体实现2.1 Vite/Webpack 配置动态哈希2.2 HTML 文件中动态引用手动引用使用 index.html 模板动态插入 2.3 结合 Cache-Control 避免缓存穿透2.4 适用于多环境的动态策略 总结 在多环境部署中&#xff0c;静态资源缓存穿透是一个常见问题…...

11、Refs:直接操控元素——React 19 DOM操作秘籍

一、元素操控的魔法本质 "Refs是巫师与麻瓜世界的连接通道&#xff0c;让开发者能像操控魔杖般精准控制DOM元素&#xff01;"魔杖工坊的奥利凡德先生轻抚着魔杖&#xff0c;React/Vue的refs能量在杖尖跃动。 ——以神秘事务司的量子纠缠理论为基&#xff0c;揭示DOM…...

crontab 定时备份 mysql 数据库

1、使用 mysqldump 命令备份数据 1.1 备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/backup/db.sql1.2 备份全部数据库的结构&#xff08;加 -d 参数&#xff09; mysqldump -uroot -p123456 -A -d > /data/backup/db.sql1.3 备份全部数据库的数据…...

数据库对象与权限管理-视图与索引管理

一、视图&#xff08;View&#xff09;管理 1. 视图的定义与本质 视图&#xff08;View&#xff09;是Oracle数据库中的逻辑表&#xff0c;它不直接存储数据&#xff0c;而是通过预定义的SQL查询动态生成结果集。视图的本质可以理解为&#xff1a; 虚拟表&#xff1a;用户可…...

德施曼重磅发布五大突破性技术及多款重磅新品,开启AI智能管家时代

当智能锁拥抱人文关怀&#xff0c;万物有灵便有了具象化的表达。 4月22日&#xff0c;智能锁领军品牌德施曼“万物有灵”2025全球新品发布会在乌镇隆重举行&#xff0c;为智能锁行业带来了AI时代的革新方案。 会上&#xff0c;德施曼创始人/CEO祝志凌重磅发布了五大突破性技术&…...

单元测试学习笔记(一)

自动化测试 通过测试工具/编程模拟手动测试步骤&#xff0c;全自动半自动执行测试用例&#xff0c;对比预期输出和实际输出&#xff0c;记录并统计测试结果&#xff0c;减少重复的工作量。 单元测试 针对最小的单元测试&#xff0c;Java中就是一个一个的方法就是一个一个的单…...

Rest Client插件写http文件直接发送请求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言&#x1f4cc; 插件介绍&#xff1a;&#x1f680; 安装方式&#xff1a;&#x1f4da; 使用示例&#xff1a;⚙️ 功能亮点&#xff1a; 前言 直接在 VSCode …...

LLM 论文精读(一)Scaling Laws for Neural Language Models

这篇文章是2020年发表的一篇LLM领域中非常重要的论文&#xff0c;由OpenAI发布&#xff0c;总结了LLM模型规模与训练数据token之间的比例关系&#xff0c;即我们熟知的 Scaling Laws&#xff0c;允许 通过观察小规模训练实验&#xff0c;提前预测大模型的效果表现&#xff0c;降…...

Spring AOP + Logback + MDC全链路日志追踪

1、背景 由于权限管理和安全规范&#xff0c;服务都部署到云上&#xff0c;只能通过日志系统查看日志。 然而&#xff0c;面对海量的日志数据&#xff0c;如何快速定位关键信息和调用链路是一个巨大的挑战。 2、方案调研 在 Spring Boot 中实现全链路日志追踪&#xff0c;核…...

SVT-AV1编码器初始化函数

一 函数解释 这个函数SVT-AV1编码器初始化的核心函数&#xff0c;负责配置编码器组件&#xff0c;分配资源并启动编码线程&#xff0c;以下时对每一行的详细解释。 函数签名和参数检查 EB_API EbErrorType svt_av1_enc_init(EbComponentType *svt_enc_component) { if (svt_enc…...

Unity 导出Excel表格

1.首先&#xff0c;需要导入EPPlus.dll&#xff1b;&#xff08;我这里用的是Unity 2017.3.0f3&#xff09; https://download.csdn.net/download/qq_41603955/90670669 2.代码如下&#xff1a; using UnityEngine; using UnityEditor; using System.IO; using OfficeOpenXm…...

Web前端开发技术——HTML5、CSS3、JavaScript

一、HTML 1.基本结构 <html lang "en"><head><meta charset"UTF-8"><meta name"Keywords" content""><meta name"Description" content""><title>Web网页标题</title&g…...

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

【华为HCIP | 华为数通工程师】821—多选解析—第十二页

多选727、某台路由器的输出信息如下所示,以下描述正确的有哪些选项? A、路由器Router ID为10.0.1.1 B、路由器Router ID为10.0.2.2。 C、本路由器的接口地址为10.0.12.2。 D、本路由器是DR。 解析:display ospf peer //获取的OSPF邻居信…...

Selenium 在爬取过程中,网络响应被退出的解决方案

我在使用 Selenium 爬取网站的时候&#xff0c;直接get url &#xff0c;却立马闪退&#xff0c;遇到了获取网络响应直接被退出的问题。 这通常是由于 反爬机制、浏览器检测 或 网络限制 导致的。 以下是 完整排查与解决方案&#xff1a; 1. 检查常见原因 问题类型典型表现可…...

楼宇自控怎样全方位融入建筑领域,为绿色建筑发展添砖加瓦

在全球积极倡导可持续发展的大背景下&#xff0c;绿色建筑已成为建筑领域发展的必然趋势。绿色建筑旨在减少对环境的负面影响&#xff0c;提高能源利用效率&#xff0c;为用户提供健康、舒适的室内环境。而楼宇自控系统作为建筑智能化的核心组成部分&#xff0c;正以其独特的技…...

语音合成(TTS)从零搭建一个完整的TTS系统-第二节-中文转拼音

一、概述 本节我们进行语音合成前端中的第二步&#xff0c;需要把中文转换为拼音。通过python和c两种语言进行实现&#xff0c;python可以直接调用pypinyin库实现。c实现是本节的重点&#xff0c;首先根据词典进行分词&#xff0c;接着把分词后的词进行词典映射&#xff0c;得到…...

基于springboot的停车位管理系统(源码+数据库)

12基于springboot的停车位管理系统&#xff1a;前端 thymeleaf、Jquery、bootstrap&#xff0c;后端 Springboot、Mybatis&#xff0c;系统角色分为&#xff1a;用户、管理员&#xff0c;管理员在管理后台录入车位信息&#xff0c;用户在线查找车位、预约车位&#xff0c;解决停…...

深入理解 Spring @Configuration 注解

在 Spring 框架中,@Configuration 注解是一个非常重要的工具,它用于定义配置类,这些类可以包含 Bean 定义方法。通过使用 @Configuration 和 @Bean 注解,开发者能够以编程方式创建和管理应用程序上下文中的 Bean。本文将详细介绍 @Configuration 注解的作用、如何使用它以及…...

15.三数之和(LeetCode)java

个人理解&#xff1a; 1.使用双指针做法&#xff0c;首先对数组进行排序 第一重for循环控制第一个数&#xff0c;对数组进行遍历。双指针初始化为lefti1, rigthnums.length-1。然后使用while循环移动双指针寻找合适的数。因为返回的是数&#xff0c;不是下标&#xff0c;数不能…...

2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(10卷)任务书

2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷&#xff08;10卷&#xff09;任务书 模块A&#xff1a;大数据平台搭建&#xff08;容器环境&#xff09;&#xff08;15分&#xff09;任务一&#xff1a;Hadoop 伪分布式安装配置任务二&#xff1a;Flume安装…...

Redis—内存淘汰策略

记&#xff1a;全体LRU&#xff0c;ttl LRU&#xff0c;全体LFU&#xff0c;ttl LFU&#xff0c;全体随机&#xff0c;ttl随机&#xff0c;最快过期&#xff0c;不淘汰&#xff08;八种&#xff09; Redis 实现的是一种近似 LRU 算法&#xff0c;目的是为了更好的节约内存&…...

新能源汽车可视化大屏系统毕业设计

以下是一个基于Python和Flask框架的新能源汽车可视化大屏系统后台代码示例。这个系统提供API接口用于前端大屏展示新能源汽车相关数据。 主应用文件 (app.py) python from flask import Flask, jsonify, request from flask_cors import CORS import random from datetime imp…...

02-keil5的配置和使用

一、创建工程 1、在菜单栏”Project”&#xff0c;在弹出的下拉菜单&#xff0c;选择“New uVision Project”。 2、在弹出的对话框&#xff0c;填写工程的名字&#xff0c;例如工程名字为project。 3、为保存的工程&#xff0c;选择对应的芯片。 4、为当前工程&#xff0c;添…...

电脑硬盘丢失怎么找回?解决硬盘数据恢复的2种方法

无论是个人用户还是企业用户来讲&#xff0c;存储在磁盘中的文档、图片、视频、音频等数据都具有相当的价值。但在日常使用过程中&#xff0c;误删操作、病毒攻击、硬件故障等情况都可能造成电脑硬盘突然消失不见数据丢失。面对电脑硬盘丢失这类问题时&#xff0c;采取正确的应…...

【Spring】依赖注入的方式:构造方法、setter注入、字段注入

在Spring框架中&#xff0c;除了构造器注入&#xff08;Constructor Injection&#xff09;和Setter注入&#xff08;Setter Injection&#xff09;&#xff0c;还有一种依赖注入方式&#xff1a;字段注入&#xff08;Field Injection&#xff09;。字段注入通过在Bean的字段上…...