【算法笔记】C++ 读入输出-由浅到深(包含快读快写)

本文介绍了C++中cin/cout、scanf/printf的基础用法,并重点讲解了快读(read)和快写(write)的实现,帮助程序员提高程序运行效率,解决因输入输出导致的超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引子

也许大家常常有遇到过这种情况,一个“看似”完美的程序,却莫名超时了。然后就满脸苦恼地看着代码,看了一天又一天。直到有一天,一位神仙从天而降,忿然曰:“汝亦知 scanf 乎?吾 read 不亦精乎?”Orz Orz……

那么,今天我们就来看一看快读和快写。本蒟蒻不才,还请大佬指教!

cin/cout

err…这个就不说了吧。蒟蒻必备!

读入、输出数字
	int x;
	cin >> x;
	cout << x;
读入、输出字符
	char ch;
	cin >> ch;
	cout << ch;
读入、输出字符串

注意:读入遇空格结束
示例:

Input:Orz Dalao
Output:Orz
	string s;
	cin >> s;
	cout << s;

scanf/printf

同样是蒟蒻的利器!用法也很简单,具体如下👇

读入、输出数字
	int x;
	scanf("%d",&x);
	printf("%d",x);
读入、输出字符
	char ch;
	scanf("%c",&ch);
	printf("%c",ch);
读入、输出字符数组(相当于字符串 scanf、printf 不能读入、输出字符串!!!

注意:读入遇空格结束
示例:

Input:Orz Dalao
Output:Orz
	char s[2020];
	scanf(
C++ 中,取和入文件或数据流是处理大量数据或高性能要求场景的关键需求。以下是一些常用的方法和技术,它们可以显著提升 I/O 操作的效率。 ### 1. 使用二进制模式文件 相比于文本模式,二进制模式能够避免字符转换的开销,并且可以一次性大块数据。适用于结构体、数组等复杂数据类型的高效处理。 ```cpp #include <fstream> struct Data { int id; float value; }; // 入二进制数据 std::ofstream outFile("data.bin", std::ios::binary); Data writeData = {1, 3.14f}; outFile.write(reinterpret_cast<char*>(&writeData), sizeof(Data)); outFile.close(); // 取二进制数据 std::ifstream inFile("data.bin", std::ios::binary); Data readData; inFile.read(reinterpret_cast<char*>(&readData), sizeof(Data)); inFile.close(); ``` 该方法通过 `write()` 和 `read()` 成员函数实现二进制操作,避免了格式化输入输出的性能损耗[^2]。 --- ### 2. 使用缓冲区优化 I/O 操作 频繁调用单字符或小块数据的会导致性能下降。通过一次性取或入较大的数据块来减少 I/O 次数。 ```cpp const size_t bufferSize = 1024 * 1024; // 1MB 缓冲区 char buffer[bufferSize]; std::ifstream inFile("largefile.txt"); while (inFile.read(buffer, bufferSize)) { // 处理 buffer 中的数据 } inFile.close(); ``` 这种方式通过一次性取大量数据,减少磁盘访问次数,从而提高性能[^1]。 --- ### 3. 使用内存映射文件(Memory-Mapped Files) 内存映射文件是一种高级技术,它将文件内容映射到进程的地址空间,使得文件如同访问内存一样高效。C++ 标准库不直接支持内存映射,但可以通过系统 API(如 Windows 的 `CreateFileMapping` 和 Linux 的 `mmap`)实现。 示例(Linux 下使用 `mmap`): ```cpp #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> int fd = open("data.bin", O_RDONLY); struct stat sb; fstat(fd, &sb); char* addr = (char*)mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); // 使用 addr 指针访问文件内容 munmap(addr, sb.st_size); close(fd); ``` 内存映射特别适用于大文件的随机访问和共享内存场景。 --- ### 4. 使用 `std::ios_base::sync_with_stdio(false)` 提升标准流性能 在大量使用 `cin` 和 `cout` 的情况下,禁用与 C 标准库的同步可以显著提升性能。 ```cpp std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); ``` 此设置使 C++ 流与 C 的 `stdin`/`stdout` 解耦,减少同步带来的性能损耗。 --- ### 5. 使用 `fstream` 的 `seekg` 和 `seekp` 实现高效定位 在处理大文件时,使用 `seekg()` 和 `seekp()` 可以速定位到文件的任意位置,避免逐行扫描。 ```cpp std::ifstream inFile("data.bin", std::ios::binary); inFile.seekg(1024); // 移动指针到 1024 字节处 ``` 此方法适用于需要随机访问的数据结构,如索引文件或日志文件。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值