Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters
Register

Reply
 
LinkBack Thread Tools
Old 07.04.2004, 12:06   #1
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default Предгаю задачку

Используя лишь средства C/C++ записать в std::string весь файл.
Файл чисто текстовый.
Так же предлагаю найти вариант, который прочтет весь файл, но в результирующей строчке будут осутствовать пробелы (символы для которых std::isspace() даст 1).
Вот и все. Балуйтесь господа программисты.

Last edited by Agregat; 08.04.2004 at 12:15.
Reply With Quote
Old 08.04.2004, 12:14   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Видимо слабо .
Ну и ладно
Reply With Quote
Old 08.04.2004, 13:21   #3
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Видимо слабо .
Ну и ладно
одним слабо, другим лень а третьи хотят предоставить удовольствие от решения первым двум

Last edited by Aram Hambardzumyan; 08.04.2004 at 13:40.
Reply With Quote
Old 08.04.2004, 13:48   #4
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

without error-cheks:


PHP Code:
    FILEf;
    
fopen(argv[1], "rt");
    
fseek(f0SEEK_END);
    
int fLength ftell(f);
    
fseek(f0SEEK_SET);

    
std::string s("");
    
char buf[256];

    while (!
feof(f))
    {
        
int cnt fread(buf1sizeof(buf), f);
        
s.append(bufcnt);
    }

    
FILE *fout;
    
fout fopen("c:\\copyOUT.txt""w+t");
    const 
char *c;
    const 
char *cFinal;
    
s.c_str();
    
cFinal s.length();
    while (
cFinal)
    {
        
int cnt fwritec1256fout );
        
+= cnt;        
    }
    
    
fclose(fout);
    
fclose(f); 
Reply With Quote
Old 08.04.2004, 13:53   #5
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

and
PHP Code:
basic_string::replace() 
for the 2-nd part.
Reply With Quote
Old 08.04.2004, 13:59   #6
Ребе - коп!
 
Speedy Gonzales's Avatar
 
Join Date: 03 2003
Location: sfba
Age: 40
Posts: 4,188
Downloads: 0
Uploads: 0
Reputation: 29 | 3
Default

Гарика на слабо взяли.
Reply With Quote
Old 08.04.2004, 14:14   #7
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

1. Не знаю зачем replace
2. Код записи не верен. Просто попробуй файл в котором 10 байт.
правильно так
PHP Code:
fprintf(outfile"%s"str.c_str());
Или
fwrite
((void *)str.c_str(), str.length(), 1outfile); 
С С версиями разобрались. Осталось С++. Я знаю решение в одну строчку (сама запись).
Reply With Quote
Old 08.04.2004, 14:30   #8
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Ладно, зачем replace понял. Не пашет он. Кроме того это потребует дополнительный проход. Что не есть гуд.
Да, я еще соблазнился и поменьше на C написал код (короче и more error prone):
PHP Code:
    FILE fIn fopen("d:\\1.hex""r");
    
int ch;
    
std::string s;
    while (
EOF != (ch fgetc(fIn)))
    {
        
+= (charch;
    } 
Reply With Quote
Old 08.04.2004, 15:12   #9
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

Quote:
Originally Posted by Agregat
Ладно, зачем replace понял. Не пашет он. Кроме того это потребует дополнительный проход. Что не есть гуд.
Да, я еще соблазнился и поменьше на C написал код (короче и more error prone):
PHP Code:
    FILE fIn fopen("d:\\1.hex""r");
    
int ch;
    
std::string s;
    while (
EOF != (ch fgetc(fIn)))
    {
        
+= (charch;
    } 
приведенный тобою код короче.
а мой - быстрее.
в несколько раз. Раз в 7, если быть точным.

Но твой код - однозначно короче.
Reply With Quote
Old 08.04.2004, 15:25   #10
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Гарик, а хочешь еще быстрее:
1. получаешь размер файла.
2. выделяешь char *
3. копируешь
4. удаляешь.
Будет еще быстрее, чем ты сделал.

Кстати, с++ тоже медленнее, но зато короче и красивее. А на 4мб файле где 0.3с там и 0.1с. (в релиз версии).
Reply With Quote
Old 09.04.2004, 09:58   #11
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Вот решения которые мне нравятся. Истинно С++ решение.
1. наиболее красивое решение
PHP Code:
std::string s;
std::ifstream in(path);
std::getline(ins'\0'); 
2. на строчку короче, но медленнее и не так красиво.
PHP Code:
std::ifstream in(path);
std::string s(static_cast<const std::ostringstream &>(std::ostringstream() << in.rfbuf()).str()); 
3. вариант с удалением пробелов. Не самое быстрое решение
PHP Code:
std::ifstream in(path);
std::string s;
std::copy(std::istream_iterator<char>(in), std::istream_iterator(), std::back_inserter(s)); 
3.1. вариант по быстрее. Узнаем размер файла, потом s.resize(fileSize) и
PHP Code:
std::copy(std::istream_iterator<char>(in), std::istream_iterator(), s.begin()); 
Отдельно удаление пробелов из прочитанного файла:
PHP Code:
//s - это std::string.
s.erase(std::remove_if(s.begin(), s.end(), isspace), s.end());
//для хороших компиляторов std::isspace 
Как я понял у нас пишут только на С
Reply With Quote
Old 09.04.2004, 10:36   #12
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally Posted by Agregat
Вот решения которые мне нравятся. Истинно С++ решение.
1. наиболее красивое решение
PHP Code:
std::string s;
std::ifstream in(path);
std::getline(ins'\0'); 
2. на строчку короче, но медленнее и не так красиво.
PHP Code:
std::ifstream in(path);
std::string s(static_cast<const std::ostringstream &>(std::ostringstream() << in.rfbuf()).str()); 
а почему не

PHP Code:
copy(istream_iterator<char>(in), istream_iterator<char>(), back_inserter(s));
// можно предварительно зарезервировать место в строке для ускорения процесса, хотя это условие не ставилось вначале). 
? (вопрос с точки зрения красоты кода)
Reply With Quote
Old 09.04.2004, 10:50   #13
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Если я делаю reserve, тогда зачем уж тратить время и пользоваться back_insert_iterator-ом. Уж лучше сразу resize.
Reply With Quote
Old 09.04.2004, 10:53   #14
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

кстати, если убирать пробелы то можно и по-другому
PHP Code:
std::ostringstream os;
std::copy(std::istream_iterator<char>(int), std::istream_iterator<char>(), std::ostream_iterator<char>(os));
std::string s(os.str()); 
или же ...iterator<string>(..., что будетя думаю быстрее
Вот
Reply With Quote
Old 09.04.2004, 21:15   #15
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

Тому, кто скажет почему в моих примерах перед std::copy, std::getline не нужeн std:: префикс от меня 5 очков
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 12:15.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.