 |
Предгаю задачку |
 |
07.04.2004, 11:06
|
#1
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Предгаю задачку
Используя лишь средства C/C++ записать в std::string весь файл.
Файл чисто текстовый.
Так же предлагаю найти вариант, который прочтет весь файл, но в результирующей строчке будут осутствовать пробелы (символы для которых std::isspace() даст 1).
Вот и все. Балуйтесь господа программисты.
Last edited by Agregat; 08.04.2004 at 11:15.
|
|
|
08.04.2004, 11:14
|
#2
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Видимо слабо  .
Ну и ладно
|
|
|
08.04.2004, 12:21
|
#3
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally Posted by Agregat
Видимо слабо  .
Ну и ладно 
|
одним слабо, другим лень  а третьи хотят предоставить удовольствие от решения первым двум
Last edited by Aram Hambardzumyan; 08.04.2004 at 12:40.
|
|
|
08.04.2004, 12:48
|
#4
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
without error-cheks:
PHP Code:
FILE* f;
f = fopen(argv[1], "rt");
fseek(f, 0, SEEK_END);
int fLength = ftell(f);
fseek(f, 0, SEEK_SET);
std::string s("");
char buf[256];
while (!feof(f))
{
int cnt = fread(buf, 1, sizeof(buf), f);
s.append(buf, cnt);
}
FILE *fout;
fout = fopen("c:\\copyOUT.txt", "w+t");
const char *c;
const char *cFinal;
c = s.c_str();
cFinal = c + s.length();
while (c < cFinal)
{
int cnt = fwrite( c, 1, 256, fout );
c += cnt;
}
fclose(fout);
fclose(f);
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
08.04.2004, 12:53
|
#5
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
and
PHP Code:
basic_string::replace()
for the 2-nd part.
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
08.04.2004, 12:59
|
#6
|
Ребе - коп!
Join Date: 03 2003
Location: sfba
Age: 48
Posts: 4,189
Rep Power: 5
|
Гарика на слабо взяли.
|
|
|
08.04.2004, 13:14
|
#7
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
1. Не знаю зачем replace
2. Код записи не верен. Просто попробуй файл в котором 10 байт.
правильно так
PHP Code:
fprintf(outfile, "%s", str.c_str());
Или
fwrite((void *)str.c_str(), str.length(), 1, outfile);
С С версиями разобрались. Осталось С++. Я знаю решение в одну строчку (сама запись).
|
|
|
08.04.2004, 13:30
|
#8
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Ладно, зачем replace понял. Не пашет он. Кроме того это потребует дополнительный проход. Что не есть гуд.
Да, я еще соблазнился и поменьше на C написал код (короче и more error prone):
PHP Code:
FILE * fIn = fopen("d:\\1.hex", "r");
int ch;
std::string s;
while (EOF != (ch = fgetc(fIn)))
{
s += (char) ch;
}
|
|
|
08.04.2004, 14:12
|
#9
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
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)))
{
s += (char) ch;
}
|
приведенный тобою код короче.
а мой - быстрее.
в несколько раз. Раз в 7, если быть точным.
Но твой код - однозначно короче.
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
08.04.2004, 14:25
|
#10
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Гарик, а хочешь еще быстрее:
1. получаешь размер файла.
2. выделяешь char *
3. копируешь
4. удаляешь.
Будет еще быстрее, чем ты сделал.
Кстати, с++ тоже медленнее, но зато короче и красивее. А на 4мб файле где 0.3с там и 0.1с. (в релиз версии).
|
|
|
 |
|
 |
09.04.2004, 08:58
|
#11
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Вот решения которые мне нравятся. Истинно С++ решение.
1. наиболее красивое решение
PHP Code:
std::string s;
std::ifstream in(path);
std::getline(in, s, '\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
Как я понял у нас пишут только на С
|
|
|
 |
09.04.2004, 09:36
|
#12
|
The Reloaded
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Rep Power: 5
|
Quote:
Originally Posted by Agregat
Вот решения которые мне нравятся. Истинно С++ решение.
1. наиболее красивое решение
PHP Code:
std::string s;
std::ifstream in(path);
std::getline(in, s, '\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));
// можно предварительно зарезервировать место в строке для ускорения процесса, хотя это условие не ставилось вначале).
? (вопрос с точки зрения красоты кода)
|
|
|
09.04.2004, 09:50
|
#13
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Если я делаю reserve, тогда зачем уж тратить время и пользоваться back_insert_iterator-ом. Уж лучше сразу resize.
|
|
|
09.04.2004, 09:53
|
#14
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
кстати, если убирать пробелы то можно и по-другому
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>(..., что будет, я думаю быстрее.
Вот
|
|
|
09.04.2004, 20:15
|
#15
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Тому, кто скажет почему в моих примерах перед std::copy, std::getline не нужeн std:: префикс от меня 5 очков
|
|
|
All times are GMT. The time now is 01:39. |
|
|