Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Удаление символов ДОС в начале текстового файла


Автор: Voldemar2004 20.4.2009, 16:22
У меня такая проблема: есть файл в ДОС-кодировке со спецсимволами в начале:

Цитата

(s16.6H&l0O(s3B 


Город..........
...................
...................
...................
...................
...................
...................
...................


я читаю его в буфер, начиная с символа "Г" (слово "Город") до конца файла:

Код
void CutSymbols(string Text, string OutPutFileName);

void CutSymbols(string Text, string OutPutFileName);
{

        unsigned int SymbolPosition=0;
        // Пока не встретится символ 'Г'
        for(unsigned int i=0; i<100; i++)
        {
                if(Text[i] == 'ѓ') {
                SymbolPosition=i;
                break;
                }
        }

        unsigned int SymbolsCounter=strlen(Text.c_str());

        string tmpBuffer;
        for(i=SymbolPosition; i<SymbolsCounter-2; i++)
        {
        tmpBuffer += Text[i];
        }

ofstream outputFile;
outputFile.open(OutPutFileName);
outputFile << tmpBuffer << endl;
outputFile.close();

}


Все работает, но т.к. текстовые файлы очень большие ~ 100-200 Мб - время выполнения очень большое. Есть ли способ сделать быстрее ? Мне просто нужно из исходного текстового файла размером 100 Мб удалить эти символы:

Цитата
(s16.6H&l0O(s3B 


и записать файл без них.

Автор: azesmcar 20.4.2009, 16:52
Voldemar2004

Еслиб эти данные были в конце, можно было бы легко обойтись. По моему тут единственный способ - переписать файл как собственно и сделано.

Автор: zim22 20.4.2009, 17:04
200 метровый файл обработался за 1-2 секунды
Код

#include <fstream>
#include <vector>

int main()
{
  const int chunk_size = 1000000;
  std::vector<char> vc(chunk_size);  
  
  std::ifstream in("file.txt", std::ios::binary);  
  std::ofstream out("result.txt", std::ios::binary);

  in.seekg(20); // здесь укажите количество символов, которые необходимы игнорировать с начала файла
  while (in.read(&vc.front(), chunk_size)) {
    out.write(&vc.front(), chunk_size);
  }
  out.write(&vc.front(), in.gcount());

  in.close();
  out.close();

    
    return 0;
}



Автор: Voldemar2004 20.4.2009, 22:21
azesmcar, 
Цитата(azesmcar @  20.4.2009,  17:52 Найти цитируемый пост)
Еслиб эти данные были в конце, можно было бы легко обойтись.
Ну это я и сам понял smile  Но они в начале файла.

zim22, супер !  smile с меня +1  smile 

Тема закрыта   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)