Открытие файлов размером более 5 МБ и сохранение их в массиве - PullRequest
0 голосов
/ 14 января 2012

Я хочу поместить каждый байт в массив символов и переписать текстовый файл, удалив первые 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();

Проблема в том, что я не могу установить массив символов размером 5 миллионов.Я попытался использовать вектор также

    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, и многие символы отсутствуют.

Как это сделать?

Ответы [ 3 ]

2 голосов
/ 14 января 2012

В большинстве реализаций 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 голос
/ 14 января 2012

Эта часть неверна

while( in2.read((char *)&c2, 1) )
{
    in2 >> ss[w];
    w++;
}

потому что вы сначала пытаетесь прочитать один символ в c2 и, если это удастся, прочитать другой символ в ss[w].

Я совсем не удивляюсь, если вы потеряете здесь примерно половину символов!

0 голосов
/ 14 января 2012

Лучший способ решить вашу проблему - использовать возможности стандартной библиотеки. Таким образом, вам также не нужно заботиться о переполнении буфера.

Следующий код не проверен.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...