我想将每个字节放在一个char数组中,并重写文本文件,删除前100,000个字符。
int fs=0;
ifstream nm,nm1;
nm1.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt");
if(nm1.is_open())
{
nm1.seekg(0, ios::end );
fs = nm1.tellg();
}
nm1.close();
char ss[500000];
nm.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt");
nm.read(ss,fs-1);
nm.close();
ofstream om;
om.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt");
for(int i=100000;i<fs-1;i++){
om >> ss[i];
}
om.close();
问题是我无法将字符数组设置为500万大小。我也尝试使用矢量
vector <char> ss (5000000);
int w=0;
ifstream in2("C:\\Dev-Cpp\\DCS\\Decom\\a.txt", ios::binary);
unsigned char c2;
while( in2.read((char *)&c2, 1) )
{
in2 >> ss[w];
w++;
}
在这里,w的大小几乎是fs的一半,并且缺少很多角色。
怎么做?
答案 0 :(得分:2)
在大多数实现中,char ss[5000000]
尝试在堆栈上进行分配,并且与总内存大小相比,堆栈的大小是有限的。您通常可以在堆上分配比堆栈更大的数组,如下所示:
char *ss = new char [5000000];
// Use ss as usual
delete[] ss; // Do not forget to delete
请注意,如果文件大小fs
大于5000000,您将写入缓冲区的末尾。您应该限制您阅读的数据量:
nm.read(ss,min(5000000,fs-1));
答案 1 :(得分:1)
这部分不正确
while( in2.read((char *)&c2, 1) )
{
in2 >> ss[w];
w++;
}
因为你首先尝试将一个字符读入c2
,如果成功,请将另一个字符读入ss[w]
。
如果你在这里失去了大约一半的角色,我并不感到惊讶!
答案 2 :(得分:0)
解决问题的最佳方法是使用标准库的功能。这样,您也不必关心缓冲区溢出。
以下代码未经测试。
std::fstream file("C:\\Dev-Cpp\\DCS\\Decom\\a.txt", std::ios_base::in);
if (!file)
{
std::cerr << "could not open file C:\\Dev-Cpp\\DCS\\Decom\\a.txt for reading\n";
exit(1);
}
std::vector<char> ss; // do *not* give a size here
ss.reserve(5000000); // *expected* size
// if the file is too large, the capacity will automatically be extended
std::copy(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(),
std::back_inserter(ss));
file.close();
file.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt", std::ios_base::out | std::ios_base::trunc);
if (!file)
{
std::cerr << "could not open C:\\Dev-Cpp\\DCS\\Decom\\a.txt for writing\n";
exit(1);
}
if (ss.size() > 100000) // only if the file actually contained more than 100000 characters
std::copy(ss.begin()+100000, ss.end(), std::ostreambuf_iterator<char>(file));
file.close();