首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >合并大文件

合并大文件
EN

Stack Overflow用户
提问于 2009-08-13 16:27:28
回答 3查看 1.8K关注 0票数 0

我正在尝试连接C++中的两个大文件(比如UNIX cat命令: cat file1 file2 > final)。

我不知道怎么做,因为我尝试的每个方法都非常慢(例如,逐行将第二个文件复制到第一个文件中)

?做到这一点的最好方法是什么?

对不起,我太简短了,我的英语不太好

EN

回答 3

Stack Overflow用户

发布于 2009-08-13 16:31:55

在标准流中使用二进制模式来完成这项工作,而不是将其作为格式化数据进行处理。

这是一个演示,如果您想要以块为单位传输数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <fstream>
#include <vector>

std::size_t fileSize(std::ifstream& file)
{
    std::size_t size;

    file.seekg(0, std::ios::end);
    size = file.tellg();
    file.seekg(0, std::ios::beg);

    return size;
}

int main()
{
    // 1MB! choose a conveinent buffer size.
    const std::size_t blockSize = 1024 * 1024;

    std::vector<char> data(blockSize);
    std::ifstream first("first.txt", std::ios::binary),
                second("second.txt", std::ios::binary);
    std::ofstream result("result.txt", std::ios::binary);
    std::size_t firstSize  = fileSize(first);
    std::size_t secondSize = fileSize(second);

    for(std::size_t block = 0; block < firstSize/blockSize; block++)
    {
        first.read(&data[0], blockSize);
        result.write(&data[0], blockSize);
    }

    std::size_t firstFilerestOfData = firstSize%blockSize;

    if(firstFilerestOfData != 0)
    {
        first.read(&data[0], firstFilerestOfData);
        result.write(&data[0], firstFilerestOfData);
    }

    for(std::size_t block = 0; block < secondSize/blockSize; block++)
    {
        second.read(&data[0], blockSize);
        result.write(&data[0], blockSize);
    }

    std::size_t secondFilerestOfData = secondSize%blockSize;

    if(secondFilerestOfData != 0)
    {
        second.read(&data[0], secondFilerestOfData);
        result.write(&data[0], secondFilerestOfData);
    }

    first.close();
    second.close();
    result.close();

    return 0;
}
票数 6
EN

Stack Overflow用户

发布于 2009-08-13 17:06:45

如果你正在使用std::fstream,那就不要使用它,它主要用于格式化的输入/输出,字符级的操作是slower than you'd expect。相反,可以直接使用std::filebuf。这是对其他答案中的建议的补充,特别是使用更大的缓冲区大小。

票数 6
EN

Stack Overflow用户

发布于 2009-08-13 16:50:35

使用普通的老式C++:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <fstream>

std::ifstream file1("x", ios_base::in | ios_base::binary);
std::ofstream file2("y", ios_base::app | ios_base::binary);
file2 << file1.rdbuf();

Boost标头声称copy()在某些情况下是优化的,尽管我不确定这是否算数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <boost/iostreams/copy.hpp>
// The following four overloads of copy_impl() optimize 
// copying in the case that one or both of the two devices
// models Direct (see 
// http://www.boost.org/libs/iostreams/doc/index.html?path=4.1.1.4)

boost::iostreams::copy(file1, file2);

更新:

Boost复制功能兼容多种类型,因此可以与Pavel Minaev建议的使用std::filebuf相结合,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::filebuf file1, file2;

file1.open("x", ios_base::in | ios_base::binary);
file2.open("y", ios_base::app | ios_base::binary);

file1.setbuf(NULL, 64 * 1024);
file2.setbuf(NULL, 64 * 1024);

boost::iostreams::copy(file1, file2);

当然,实际的最佳缓冲区大小取决于许多变量,64k只是一个胡乱猜测。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1275415

复制
相关文章
Linux 大文件分割合并
文件分割可以使用split命令,该即支持文本文件分割,又支持二进制文件分割;而合并文件可以使用cat命令。
用户8824291
2022/02/25
4.6K0
Python 分割合并大文件
有时候,我们需要把一个大文件发送给别人,但是限于传输通道的限制,比如邮箱附件大小的限制,或者网络状况不太好,需要将大文件分割成小文件,分多次发送,接收端再对这些小文件进行合并。今天就来分享一下用 Python 分割合并大文件的方法。
somenzz
2022/10/25
1K0
Python 分割合并大文件
Linux 下大文件切割与合并
往往是因为网络传输的限制,导致很多时候,我们需要在 Linux 系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。
互联网老辛
2021/07/14
2.9K0
Linux 下大文件切割与合并
Linux 下大文件切割与合并
往往是因为网络传输的限制,导致很多时候,我们需要在 Linux 系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。
民工哥
2021/07/16
3.1K0
Linux 下大文件切割与合并
Linux 下大文件切割与合并
往往是因为网络传输的限制,导致很多时候,我们需要在 Linux 系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。
用户8639654
2021/08/05
2.5K0
linux下大文件切割与合并
原文:https://www.escapelife.site/posts/72f237d3.html
入门笔记
2022/06/02
2.5K0
编码技巧 --- 内存有限下合并大文件
「假设有10个接口访问的日志,每个日志的大小为300M,每个文件里的日志都是按照时间戳从小到大排序的。现在我们希望将这10个较小的日志文件,合并为一个大文件,合并之后的文件依旧按照时间戳从小到大排序,如果处理上述任务的机器只有1G内存,那么该如何将这10个日志文件合并?」
Niuery Diary
2023/10/22
3330
编码技巧 --- 内存有限下合并大文件
转 | Linux大文件(比如ISO)的拆分、合并、校验
大文件在实际应用传输过程中往往经历拆分、合并的过程。文件在多次传输后有可能会损坏,在使用前可以进行完整性校验。
create17
2019/03/12
4.3K0
如何在 Linux 下优雅的进行大文件切割与合并?
往往是因为网络传输的限制,导致很多时候,我们需要在 Linux 系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。
杰哥的IT之旅
2021/07/13
1K0
如何在 Linux下优雅的进行大文件切割与合并
往往是因为网络传输的限制,导致很多时候,我们需要在 Linux 系统下进行大文件的切割。这样将一个大文件切割成为多个小文件,进行传输,传输完毕之后进行合并即可。 1. 文件切割 - split 在 Linux 系统下使用 split 命令进行大文件切割很方便 [1] 命令语法 # -a: 指定输出文件名的后缀长度(默认为2个:aa,ab...) # -d: 指定输出文件名的后缀用数字代替 # -l: 行数分割模式(指定每多少行切成一个小文件;默认行数是1000行) # -b: 二进制分割模式(支持单位:k/
iMike
2021/07/01
3.8K0
git上传大文件
第一步 安装lfs git lfs install 第二步 查找大文件 find ./ -size +100M ./表示当前目录下 第三步 追踪大文件 git lfs track "大文件的名称" 第四步 正常上传git git add . git commit -m 'commit' git push origin main
西西嘛呦
2021/12/07
2.6K0
pandas 大文件操作
这几天有一个需求是读取.dta文件并转为.csv,google了一下发现pandas也是支持dta格式的
Kevinello
2022/08/19
1.5K0
pandas 大文件操作
Python 读取大文件
在处理大数据时,有可能会碰到好几个 G 大小的文件。如果通过一些工具(例如:NotePad++)打开它,会发生错误,无法读取任何内容。
py3study
2020/01/10
1.7K0
大文件切割技巧
主要用到split命令:可以将一个大文件分割成多个小文件,有时候文件太大了需要将文件分割成更小的片段,如数据库备份sql文件或者应用log
summerking
2022/10/27
1.3K0
golang 大文件分割
golang 大文件分割 package main import ( "fmt" "io/ioutil" "math" "os" "strconv" ) const chunkSize int64 = 4 << 20 func main() { fileInfo, err := os.Stat("test.zip") if err != nil { fmt.Println(err) } num := int(math.Ceil
大师级码师
2021/11/02
1.8K0
linux大文件分割
linux下文件合并是用cat来实现,那么将大文件分割成小文件怎么办呢? 我们可以用split命令来实现,既可以指定按行分割也能指定按大小分割,非常方便实用。
生信编程日常
2020/04/01
4.6K0
python 查找大文件
root="D:\" def get_FileSize(filePath): try: fsize = os.path.getsize(filePath) fsize = fsize/float(1024*1024) return round(fsize,2) except: return 0 for r,dirs,files in os.walk(root): for file in files: name=os.path.join(r,file) size=get_FileSize(name) if size>500: print(name,size)
用户5760343
2019/11/21
2.5K0
点击加载更多

相似问题

合并大文件的算法

22

合并大文件的算法

50

VB.NET合并大文件

23

合并两个大文件

13

如何合并2个大文件

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文