Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: SXP
Дата сообщения: 18.09.2004 19:58
RacOon404
CharToOem(buffer,buffer);
printf("%s\r\n",buffer);
Автор: RacOon404
Дата сообщения: 30.09.2004 20:07
Помогите с алгоритмом небольшим: нужно чтобы при выводе вводимого любое количество идущщих подряд пробелов преобразовывалось в один. Думал, не допер...
Автор: mihas83
Дата сообщения: 30.09.2004 20:50
RacOon404

Цитата:
чтобы при выводе вводимого любое количество идущщих подряд пробелов преобразовывалось в один
Так используй функцию
Код: int isspace (int c);
Автор: wiwiw
Дата сообщения: 30.09.2004 23:17
do
{
if(*str==' ' && *(str+1)==' ') continue;
putchar(*str);
}
while(*++str);
Автор: RacOon404
Дата сообщения: 01.10.2004 19:18
mihas83
А как именно заюзать?
wiwiw
а что означает звездочка, меня уже добивает то что берясь за любую книгу, всегда есть вопросы, нифига нигде ничего полностью не объясняется, откуда мен знать что такое эта звезда... мож кто разъснит и вот код не работает...

Добавлено
или скажите конктретно книгу по которой я 100% буду знать (именно просто знать) весь синтаксис, чтобы уже можно было бы работать и думать над алгоритмами, а не над тем чем вобще можно тут что-то сделать
Автор: EZH
Дата сообщения: 01.10.2004 19:25
RacOon404
Звездочка перед переменной-указателем означает само значение (того типа, на который создавался указатель). Т.е. в самой переменной-уазателе содержится всегда число - адрес в памяти. А со звездочкой - это то значение, на которое указывает указатель.
Автор: Swappp
Дата сообщения: 02.10.2004 00:33
RacOon404

Цитата:
а что означает звездочка, меня уже добивает то что берясь за любую книгу, всегда есть вопросы, нифига нигде ничего полностью не объясняется, откуда мен знать что такое эта звезда...

Сколько видел книг по C++ везде описывалась подробно работа с ссылками (т.к. практически в любой более мение большой программе они используются). Значит ты невнимательно читал или пропускал некоторые главы...
Автор: wiwiw
Дата сообщения: 02.10.2004 01:18
#include <stdio.h>
#include <conio.h>
int main ()
{
char *str,s[100];

gets(s);
str=s;
do
{
if(*str==' ' && *(str+1)==' ') continue;
putchar(*str);
}
while(*++str);
getche();
return 0;
}

лучше оформить то что я писал раньше в отдельную функцию, а то как то странно строка str=s; выглядит
Автор: RedMac
Дата сообщения: 02.10.2004 11:48
Swappp


Цитата:
Сколько видел книг по C++ везде описывалась подробно работа с ссылками (т.к. практически в любой более мение большой программе они используются). Значит ты невнимательно читал или пропускал некоторые главы...


А причём тут ссылки к звёздочкам?
Автор: Oaxa
Дата сообщения: 02.10.2004 13:32

Цитата:
А причём тут ссылки к звёздочкам?


Возможно, здесь подразумеваются не ссылки, а указатели.
Автор: vndovr
Дата сообщения: 03.10.2004 01:32
wiwiw
Цикл do {} while без проверки длины строки все же не очень корректен.

RacOon404
В C++ достаточно богатая стандартная библиотека - можно воспользоваться ей

Код:
bool is_space_pred(char c1, char c2)
{
return (c2 == ' ') && (c1 == ' ');
}

void compact_string(char* s) // Удаление повторяющихся пробелов
{
*std::unique(s, s+std::strlen(s), is_space_pred) = 0;
}
Автор: wiwiw
Дата сообщения: 03.10.2004 03:19
да, STL - великая сила
Автор: mihas83
Дата сообщения: 03.10.2004 08:08

Цитата:
да, STL - великая сила

Согласен - изящно, но для новичка - сложновато.
std::, предикаты, инклуды и т.д., недовольство компилятора...
Автор: RacOon404
Дата сообщения: 04.10.2004 17:09
короче я окончательно запутался...
Автор: KADABRA
Дата сообщения: 18.11.2004 22:19
Помогите найти способ быстрого чтения файла в массив по строчке, и обязательно на Win + Unix.
Файл около 3 Мб, текст.
Автор: Swappp
Дата сообщения: 18.11.2004 22:43
KADABRA

Цитата:
Помогите найти способ быстрого чтения файла в массив по строчке, и обязательно на Win + Unix.
Файл около 3 Мб, текст.

что то типа file() в php? Но проблема, в C/C++ массивы статические... хотя...
Что бы читать быстро, не надо читать по символьно, а лучше блоками примерно 4096 байт.
дальше по-символьно проходим и когда натыкаемся на \n что то делаем (не люблю я статически массивы, по этому здесь не очень помогу)...
Автор: WiseAlex
Дата сообщения: 19.11.2004 09:39
KADABRA
в принципе fstream работает достаточно быстро, тем более файл маленький (3ГБ - это проблема) - а так
std::fstream fs;
std::string s;
и в цикле
fs>>s;
Автор: nobody2
Дата сообщения: 19.11.2004 10:24

Код:
std::ifstream f("filename.ext", std::ios::in | std::ios::binary);

if (!f)
{
cout << "file open error!!!" << endl;
return 1;
}

std::vector<char> buffer;
std::ifstream::pos_type size = 0;

if (f.seekg(0, std::ios::end))
{
size = f.tellg();
}

if (size && f.seekg(0, std::ios::beg))
{
buffer.resize(size);
f.read(&buffer[0], size);
}
Автор: TheChampion
Дата сообщения: 19.11.2004 10:57
Господа!

У меня возникла непонятная мне проблема.

Я записываю в файл данные в виде потока байтов с применением std::ofstream::write, куда передаю указатель на данные, приведенный к типу char*, и sizeof(T), т. е.

void write(std::ofstream& to, T data)
{
char* buff = reinterpret_cast<char*>(T);
to.write(buff, sizeof(T));
}

В качестве данных фигурируют int, double, char*.

Потом эти данные считываются функциями вида

T read_T(std::ifstream& from)
{
char buff[sizeof(T)];
from.read(buff, sizeof(T));
return *reinterpret_cast<T*>(buff);
}

Если считывается строка, то память выделяется.

Данные представляют собой несколько статических переменных, после чего идет динамический массив.

Все статические данные считываются отлично (в т. ч. и строки!), а вот массив считывается странно. Сначала считывается несколько значений (их число непонятным образом зависит от размера динамической матрицы), после чего from поднимает какой-то флаг (точно не проверял) и из него ничего не считывается. Более того, этот файл невозможно считать побайтно get() --- программа доходит до того же места и поднимает тот же флаг. Только функции из Win API (CreateFile/ReadFile) преодолевают это место.

Утечек ресурсов/выхода за границы массива нет.
Автор: WiseAlex
Дата сообщения: 19.11.2004 12:15
TheChampion
описанные функции подходят для автоматических переменных, а для динамических надо написать что-то другое
T read_T(std::ifstream& from)
{
char buff[sizeof(T)];
from.read(buff, sizeof(T));
return *reinterpret_cast<T*>(buff);
}
для автоматических переменных значение будет скопировано, а для динамических...
если динамические что-то вроде Т* тогда нужен new
Автор: TheChampion
Дата сообщения: 19.11.2004 13:36
WiseAlex

Цитата:
для автоматических переменных значение будет скопировано, а для динамических...
если динамические что-то вроде Т* тогда нужен new


Да проблема не в этом. Память выделятется как надо. Глючный участок кода выглядит так:

double** data = new double*[N];
for(int i = 0; i < N; i++)
{
data[i] = new double[M];
for(int j = 0; j < M; j++)
data[i][j] = read_double(from); // Где-то здесь ошибка
}

Причем размер файла в точности совпадает с ожидаемым, т. е. конец файла не должен наступить "вдруг".
Автор: nobody2
Дата сообщения: 19.11.2004 15:05
TheChampion
1. В каком режиме открывается файл?
2. Всегда ли успешно выполняется from.read() при обработке массива?
Автор: TheChampion
Дата сообщения: 19.11.2004 17:01
1. Файл открывается в том режиме, что установлен по умолчанию в конструкторе std::ofstream.

2. Какие есть причины у std::ifstream::read не выполняться до достижения конца файла?
Автор: KADABRA
Дата сообщения: 19.11.2004 18:50
Swappp

Цитата:
что то типа file() в php?

Вот именно "file() в php", но быстрее, и в С++ работа с памятью быстрее, а в файле надо будет искать и сравнивать.
Подскажите способ вычисления времени выполнения проги.
Автор: Swappp
Дата сообщения: 19.11.2004 19:06
KADABRA
Ну основной тормоз я тебе назвал, это чтение посимвольно.

Цитата:
Подскажите способ вычисления времени выполнения проки.

*nix:

Код: $ time ./app
Автор: KADABRA
Дата сообщения: 19.11.2004 19:22
Swappp

Цитата:
*nix:
$ time ./app

Thnx
А на вин(Не могу FreeBSD 5.3 найти)?


Код:
const int MAX_SIZE = 256;

vector<string> vecDB_unform;//Unformatted strings
ifstream fDBFile;//File obj
fDBFile.open(argv[1]);//Opening file
//string strDB;//Temp string
char tmp[MAX_SIZE];
while(fDBFile.getline(tmp, MAX_SIZE))
{
vecDB_unform.push_back(tmp);
}

cout << endl << "End";
cin.get();
return 0;
Автор: Swappp
Дата сообщения: 19.11.2004 19:48
KADABRA
Так это же фактически скомпилированный exe а не php...

Цитата:
Вышла скорость:

Цитата:

End
Exec time: 0.24817

Я же говорю, читай файлы блоками по больше, минимум 4kbyte. getline наверно плохая функция, напиши аналог

Цитата:
А на вин

Не знаю...
Автор: KADABRA
Дата сообщения: 19.11.2004 20:12
Swappp

Цитата:
напиши аналог

Щасс...
При чтении целого файла за раз:
End
Exec time: 0.03646

Теперь надо на строки делить...
А как?
А потом строки делит на отдельные переменные:
Строка
Цитата:

"94585424","94585439","SE","SWE","SWEDEN"

Надо разделит на ULONG, ULONG, char[2], char[3], (up to char[20])
(Как explode(",", ... в PHP)

На вин: я на ПХП проверяю
<?php
$timeparts = explode(" ", microtime());
$starttime = $timeparts[1] . substr($timeparts[0], 1);

echo `E:/WorkSCR/CppSRC/ip2country/Release/ip2country.exe ip-to-country.csv 127.0.0.1`;

$timeparts = explode(" ", microtime());
$endtime = $timeparts[1] . substr($timeparts[0], 1);
echo "<br>Exec time: " . round($endtime - $starttime, 5);
?>
Автор: Swappp
Дата сообщения: 19.11.2004 20:36
KADABRA

Цитата:
Теперь надо на строки делить...

А куда ты весь файл прочитал?
Автор: KADABRA
Дата сообщения: 19.11.2004 20:46
Swappp
Ошибочка.
Exec time: 0.03646 Было при одном getline()
Файл читал в char tmp[MAX_] или string strTmp

Добавлено
Создаётся впечатление, что PHP работает с дисками быстрее, чем C++

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.