如何打开文本文件并将其所有行附加到C++中的另一个文本文件?我主要找到解决方案,用于从文件到字符串的单独读取,以及从字符串写入文件.这可以优雅地结合在一起吗?
并不总是给出两个文件都存在.访问每个文件时应该有一个bool返回.
如果这已经偏离主题,我很抱歉:将文本内容附加到文件中是否存在冲突,这意味着多个程序可以同时执行此操作(行的顺序无关紧要)?如果不是,什么是(原子)替代品?
我正在开发一个应用程序,需要使用QT(5.6.1)将大量文件从一个文件夹复制到另一个文件夹
为此,我一直在使用这种QFile::copy()方法.这样做很有效,除了一件事:它非常慢.使用Windows资源管理器执行相同的复制操作所需的时间超过两倍.
想知道为什么会这样,我挖了QT源代码,我发现了这个qfile.cpp,看起来很相关:
char block[4096];
qint64 totalRead = 0;
while(!atEnd()) {
qint64 in = read(block, sizeof(block));
if (in <= 0)
break;
totalRead += in;
if(in != out.write(block, in)) {
close();
d->setError(QFile::CopyError, tr("Failure to write block"));
error = true;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,据我所知,复制操作使用4096字节的缓冲区.这对于复制操作来说非常小,很可能是问题的原因.所以我做的是将缓冲区的大小更改为:
char block[4194304]; // 4MB buffer
Run Code Online (Sandbox Code Playgroud)
然后我重建了整个QT库以包含此更改.但是,所有的修改都完全打破了这个方法.现在,当我的应用程序尝试调用QFile :: Copy()时,操作立即中断(方法甚至没有开始运行,根据QtCreator的调试器在第一行之前停止).调试器告诉我:
The inferior stopped because it received a signal from the Operating System.
Signal name :
SIGSEGV
Signal meaning :
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我的c …
全部,原谅我是C++世界的新手,我在这里找到了一个复制文件源代码.
帖子中的第一个样本使用了ANSI C库.所以我想在我的电脑上测试这个样本.但我发现在我的c ++项目中有错误说Can not open the source file cstdio.h.我没有在我的c:磁盘中找到它.我需要安装windows sdk吗?BTW.我的项目是一个WDK项目.谢谢.
我试图逐字节复制exe文件.我比较了2的hex文件,它们是完全不同的.似乎有些值没有被加载..
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main(){
ifstream fin("file.exe", ifstream::binary);
vector<char> buffer(1, 0);
ofstream newfile;
newfile.open("newfile.exe", ios::binary);
while (fin.read(buffer.data(), buffer.size())){
streamsize s = fin.gcount();
for (int i = 0; i < buffer.size(); i++){
if (buffer[i] != EOF){
newfile << buffer[i];
cout << buffer[i] << endl;
} else {
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我需要一个跨平台的便携式功能,能够将100GB +二进制文件复制到新目的地.我的第一个解决方案是:
void copy(const string &src, const string &dst)
{
FILE *f;
char *buf;
long len;
f = fopen(src.c_str(), "rb");
fseek(f, 0, SEEK_END);
len = ftell(f);
rewind(f);
buf = (char *) malloc((len+1) * sizeof(char));
fread(buf, len, 1, f);
fclose(f);
f = fopen(dst.c_str(), "a");
fwrite(buf, len, 1, f);
fclose(f);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,该计划非常缓慢.我怀疑缓冲区必须在内存中保持100GB +.我很想尝试新代码(从一个健全,安全,有效的方式复制文件):
std::ifstream src_(src, std::ios::binary);
std::ofstream dst_ = std::ofstream(dst, std::ios::binary);
dst_ << src_.rdbuf();
src_.close();
dst_.close();
Run Code Online (Sandbox Code Playgroud)
我的问题是关于这一行:
dst_ << src_.rdbuf();
C++标准对此有何评论?代码是编译为逐字节传输还是只是整个缓冲区传输(就像我的第一个例子)?
我很好奇<<编译成对我有用的东西?也许我不必把时间花在其他事情上,让编译器在运营商内部完成工作?如果操作员转换为我的循环,我为什么要自己做?
PS:std::filesystem::copy不可能,因为代码必须适用于C++ 11.