C++中文本文件读取优化-使用缓冲

    C++中可以采用stream读取文本文件,基本方式是一次一行,编程简洁易行,比用C方便多了。但是,凡事有利有弊,当文件行数较多时,文件读取IO次数就会随之增加,文件读取的时间会急剧增长。因为文件IO的时间要远大于CPU在内存中处理数据的时间,假如IO时间是毫秒级的,那么CPU在内存处理数据是纳秒级的。

    很显然,C++中文本文件读取优化要解决的基本问题之一就是减少IO次数,最常用的方法之一是缓冲,也就是一次性将数据会部读入内存之后再处理。例如:

1. C++文本文件读写程序(基本方式)

 

2. 使用缓冲的读写程序

 

后者比前者的读写速度要快很多倍。主要原因就是后者的文件IO次数远远少于前者。

3. Java中的缓冲应用

    其实缓冲在各种语言中都广泛用到,目的不外乎加快数据读写速度,下面是Java中的文本文件读写程序:

 

4. 备注

    上文中的示例不考虑文本读取后对文本行的处理,其实只是一个简单的复制程序。如果仅仅复制文本文件的话,也可以这样:

    还可以这样:

 

 

参考文献:http://topic.csdn.net/u/20110616/11/7028e734-6e84-4704-8de7-61f14b884781.html

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要注意的是,UTF-16是一种双字节编码,而GBK是一种单字节编码,它们之间的字符集是不同的。因此,将UTF-16文本转换为GBK格式需要进行字符集转换。 以下是使用FILE类读取UTF-16文本文档并转换为GBK格式的示例代码: ```c++ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> int main() { FILE *fp = fopen("utf16.txt", "rb"); // 打开UTF-16文本文件 if (!fp) { std::cerr << "Failed to open file." << std::endl; return -1; } // 获取文件大小 fseek(fp, 0, SEEK_END); int fileSize = ftell(fp); fseek(fp, 0, SEEK_SET); // 读取文件内容 char *buffer = new char[fileSize]; fread(buffer, 1, fileSize, fp); fclose(fp); // 转换字符集 wchar_t *wbuffer = reinterpret_cast<wchar_t*>(buffer); int wbufferSize = fileSize / sizeof(wchar_t); setlocale(LC_ALL, "chs"); // 设置当前区域为文简体 char *gbkBuffer = new char[wbufferSize * 2]; wcstombs(gbkBuffer, wbuffer, wbufferSize); // 输出转换后的内容 std::cout << gbkBuffer << std::endl; delete[] buffer; delete[] gbkBuffer; return 0; } ``` 在上面的代码,我们首先打开了一个UTF-16文本文件,然后读取文件内容并存储在缓冲。接下来,我们将wchar_t类型的缓冲区转换为char类型的缓冲区,并使用setlocale()函数将当前区域设置为文简体。最后,我们使用wcstombs()函数将wchar_t类型的缓冲区转换为char类型的缓冲区,并输出转换后的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值