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

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

Автор: Swappp
Дата сообщения: 19.11.2004 21:07
KADABRA
Нет, скорость отличается не сильно, но дело в том, что в PHP функции оптимизированы в то время как в C++ это доверили тебе Темболее угадай с трех раз на чем написан PHP
Я давно писал маленькую программку, которая читала файл и искала идущее подряд группы символов из 0x01 неизвестное кол-во раз, так вот без оптимизации (чтение файла по-символьно) винт ужасно скрипел (файл ~600Mb) и я даже не дождался завершения. Но после оптимизации чтение заняло всего несколько секунд (не многим больше 15).
Попробуй STL'овский getline:

Код: #include <string>
...
getline(ifstream, str);
...
Автор: KADABRA
Дата сообщения: 20.11.2004 10:37
Swappp

Цитата:
Попробуй STL'овский getline:

Его и пробовал.

Добавлено

Цитата:
так вот без оптимизации

Но каким образом читая по 4кб можно потом делит ровно на строки? Они могут быть разной длинны.
Можно ещё создать индексный файл с указанием начала каждой строки

Добавлено
Что getline, что
while(fDBFile >> strTmp)
{
//
}
при построковом чтении дают один результат.
Похоже мои надежды сделать это на С++ быстрее, чем на ПХП не оправдаются

Добавлено
Но ведь на сколько я знаю ifstream'ы и оfstream'ы и так буферизируют поток. Ну как мне его гнать? Может комилировать чем-то другим, а не MSVC++?
Автор: Swappp
Дата сообщения: 20.11.2004 14:01
KADABRA

Цитата:
Его и пробовал.

Нет, ты его не пробовал, ты использовал getline из ifsream. Хотя скорее всего разница не большая.

Цитата:
Но каким образом читая по 4кб можно потом делит ровно на строки? Они могут быть разной длинны.

Реализацию сейчас сделать не смогу, но алгоритм примерно такой:
1. читаем блок длинной 4 кб
2. проходим по нему циклом и ищем \n помещая все данные в переменную (скорее всего для производительности надо использовать char[], хотя можно попробовать string, тогда код будет проще)
2.1 если находим \n помещаем все что добавили в массив, и стираем некоторые временные переменные, но продолжаем выполнение цикла

Примерно так. Нужно еще несколько временных переменных, что бы переносить данные между разрывами.

Добавлено
KADABRA

Цитата:
Но ведь на сколько я знаю ifstream'ы и оfstream'ы и так буферизируют поток.

По-моему нет, буферизация есть на уровне работы с файловой системой, но когда ты запросил прочитать 1 байт, естественно остальные не будут читаться в буфер, т.к. неизвестно нужны ли они. Смена компилятора тоже не поможет.
Автор: KADABRA
Дата сообщения: 20.11.2004 15:11
Swappp
Ну смысл понятен, но я думаю скорость прохода в цыклах не даст превзойти ПХП. Но мне удалось повысит скорость работы скрипта на ПХП разбиением 2-х Мб файла на более мелкие.

Цитата:

UA
UKR
UKRAINE

exec time: 0.00606

Это был скрипт определения страны по ИП.
Прога на С++ задумывалась как "переходник" между скриптом на ПХП и ФС. В общем вопрос не отпадает, но он уже не такой срочный.
Автор: Swappp
Дата сообщения: 20.11.2004 15:42
KADABRA

Цитата:
Ну смысл понятен, но я думаю скорость прохода в цыклах не даст превзойти ПХП.

Это смотря какой проц. В современных компьютера самый главный тормоз это винт. Соответственно читая на макс. скорости блоки в ОЗУ и дальнейшее разбитие этих данных на строки ускорит работу. И опять же PHP написан на С++...

Добавлено

Код: PHP_FUNCTION(file)
{
char *filename;
int filename_len;
char *slashed, *target_buf=NULL, *p, *s, *e;
register int i = 0;
int target_len, len;
char eol_marker = '\n';
long flags = 0;
zend_bool use_include_path;
zend_bool include_new_line;
zend_bool skip_blank_lines;
php_stream *stream;
zval *zcontext = NULL;
php_stream_context *context = NULL;

/* Parse arguments */
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lr!", &filename, &filename_len, &flags, &zcontext) == FAILURE) {
return;
}
if (flags < 0 || flags > (PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES | PHP_FILE_NO_DEFAULT_CONTEXT)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%ld' flag is not supported.", flags);
RETURN_FALSE;
}

use_include_path = flags & PHP_FILE_USE_INCLUDE_PATH;
include_new_line = !(flags & PHP_FILE_IGNORE_NEW_LINES);
skip_blank_lines = flags & PHP_FILE_SKIP_EMPTY_LINES;

context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);

stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
if (!stream) {
RETURN_FALSE;
}

/* Initialize return array */
array_init(return_value);

if ((target_len = php_stream_copy_to_mem(stream, &target_buf, PHP_STREAM_COPY_ALL, 0))) {
s = target_buf;
e = target_buf + target_len;

if (!(p = php_stream_locate_eol(stream, target_buf, target_len TSRMLS_CC))) {
p = e;
goto parse_eol;
}

if (stream->flags & PHP_STREAM_FLAG_EOL_MAC) {
eol_marker = '\r';
}

/* for performance reasons the code is duplicated, so that the if (include_new_line)
* will not need to be done for every single line in the file.
*/
if (include_new_line) {
do {
p++;
parse_eol:
if (PG(magic_quotes_runtime)) {
/* s is in target_buf which is freed at the end of the function */
slashed = php_addslashes(s, (p-s), &len, 0 TSRMLS_CC);
add_index_stringl(return_value, i++, slashed, len, 0);
} else {
add_index_stringl(return_value, i++, estrndup(s, p-s), p-s, 0);
}
s = p;
} while ((p = memchr(p, eol_marker, (e-p))));
} else {
do {
if (skip_blank_lines && !(p-s)) {
s = ++p;
continue;
}
if (PG(magic_quotes_runtime)) {
/* s is in target_buf which is freed at the end of the function */
slashed = php_addslashes(s, (p-s), &len, 0 TSRMLS_CC);
add_index_stringl(return_value, i++, slashed, len, 0);
} else {
add_index_stringl(return_value, i++, estrndup(s, p-s), p-s, 0);
}
s = ++p;
} while ((p = memchr(p, eol_marker, (e-p))));
}

/* handle any left overs of files without new lines */
if (s != e) {
p = e;
goto parse_eol;
}
}

if (target_buf) {
efree(target_buf);
}
php_stream_close(stream);
}
Автор: TheChampion
Дата сообщения: 22.11.2004 07:27

Цитата:
Причем размер файла в точности совпадает с ожидаемым, т. е. конец файла не должен наступить "вдруг".


Я понял, в чем проблема и решил ее. Файл-то БИНАРНЫЙ, вот и открывать его надо с флагом std::ios_base::binary!
Автор: modulo
Дата сообщения: 12.12.2004 10:15
подскажите как из программы с++ билдере вызвать какое-нибудь приложение (если конкретней, то мне надо запустить винамп, сразу играющий определенный плейлист)
Автор: WiseAlex
Дата сообщения: 12.12.2004 12:02
modulo
ShellExecute
CreateProcess
более подробно в MSDN
Автор: SXP
Дата сообщения: 12.12.2004 14:20
+WinExec()
Автор: nobody2
Дата сообщения: 14.12.2004 11:12
SXP
Никак не
Цитата:
WinExec()


Цитата:
Это устаревшая функция, оставленная для совместимости со старыми программами. Вместо нее следует использовать CreateProcess.

взято из msdn'а.
Автор: Mephistopheles
Дата сообщения: 31.12.2004 18:30
Всем привет.
Сел изучать С++
Появляются вопросы. Например - есть часть кода:


Код:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#pragma hdrstop
#include "structure.h"
using namespace std;

int main(int, char**){
mailListRecord* listArray[3];
for(i = 0; i < 3; i++)
listArray[i] = new mailListRecord;
cout << endl;
do {
cout << "First name: ";
cin.getline(listArray[index]->firstName,
sizeof(listArray[index]->firstName) -1);
cout << "Last name: ";
cin.getline(listArray[index]->lastName,
sizeof(listArray[index]->lastName) -1);
cout << "Address: ";
cin.getline(listArray[index]->address,
sizeof(listArray[index]->address) -1);
cout << "Nick-name: ";
cin.getline(listArray[index]->nickName,
sizeof(listArray[index]->nickName) -1);
index++;
cout << endl;
}while(index < 3);
clrscr();
for (i = 0; i < 3; i++){
showRecord(i, *listArray[i]);
}
cout << "Choose a record: ";
char rec;
Автор: KADABRA
Дата сообщения: 31.12.2004 23:39
Mephistopheles
На чём компилируешь?
clrscr() не является стандартной функцией, а может быть в какой-то библиотеке.
На сколько я понял - это очистка экрана.
Автор: mihas83
Дата сообщения: 01.01.2005 00:28
KADABRA

Цитата:
clrscr() не является стандартной функцией, а может быть в какой-то библиотеке.
На сколько я понял - это очистка экрана.

Совершенно верно, поддерживается только на компьютерах IBM PC или совместимых с ними. Функция не совместима с Windows..
За нее, как раз, ''отвечает''
Код: #include<conio.h>
Автор: eugrus
Дата сообщения: 01.01.2005 00:54

Цитата:
clrscr();

Mephistopheles под какую ОС компилил?
conio.h - DOS'овская библиотека
ни под win, ни под nix работать не будет
Автор: WolfEnstein
Дата сообщения: 01.01.2005 22:39
#include <iostream>

еще вроде <iosteram.h> писать надо.
да и под какую ось пишешь?
Автор: KADABRA
Дата сообщения: 01.01.2005 23:14
WolfEnstein

Цитата:
#include <iostream>

еще вроде <iosteram.h> писать надо.

iostream (без .h) - новый стандарт, и и всё в пространстве имён std
Автор: Mephistopheles
Дата сообщения: 04.01.2005 18:15
Да, все правильно - я пишу под WinXP
Компилятор из M$ VCPP 6 - скажите как узнать точнее - скажу точнее

В общем как я понял - пора менять учебник - этот староват

Автор: wiwiw
Дата сообщения: 06.01.2005 02:43
clrscr - не поддерживается MS VC. (Борландом поддерживается).
в MSDN рекомендуют делать так:


system("cls");
Автор: Wadimus
Дата сообщения: 05.03.2005 21:36
Привет всем!

Просьба помочь разобраться с некоторыми моментами языка C.

Значит эта програмка призвана выдирать содержание XML тега.

Сначала написал функцию, возвращаюшую ссылку на данные так


Код:
char* get_tag_contents(char* starttag, char* endtag, char* string)
{
char* pointer;
int clength;
char* result;

pointer = strstr(string, starttag) + strlen(starttag);
clength = strlen(pointer) - strlen(strstr(string, endtag));
strncpy(result, pointer, clength);
strcat(result, "\0");
return result;
}
Автор: mihas83
Дата сообщения: 05.03.2005 22:23
Wadimus

Цитата:
Тогда я решил чтобы она возврашала конкретно данные, а не ссылку и написал так

Возвращала она у тебя не ссылку, а указатель.

Цитата:
Намекните, в чем криворукость

А где выделена память под str?

Цитата:
char* str = "<abcd>123</abcd><info>informacija</info><def>456</def>";

Автор: Wadimus
Дата сообщения: 05.03.2005 22:32
Ну да, не ссылка, а указатель

А насчет памайти, там вроде же функция принимает указатель, а он у меня описан. А потом эта строка больше нигде не используется... Вроде как если str указявет на строку, значит, ента строка же какое-то место занимает

З.Ы. Сорри за возможно глупые размышления, раньше писал на PHP, не привык к некоторым "особенностям" C
Автор: wiwiw
Дата сообщения: 06.03.2005 13:32
с памятью все нормуль.
но прототипы функций описывают как глобальные переменные.
поэтому строку

Цитата:
char get_tag_contents(char*, char*, char*);

вынеси за main().


вместо

Цитата:
return *result;

надо

Код:
return result;
Автор: distance
Дата сообщения: 08.03.2005 02:50
wiwiw

Цитата:
т.к. имя массива - это указатель на его первый элемент


это распространенное и ошибочное заблуждение.
массив типа T - это вполне самостоятельный агрегат c/c++ и онне является указателем на первый элемент, а неявно приводится компилятором к rvalue типа T* в большинстве случаев. а это две большие разницы.
есть и исключения
- унарный оператор взятия адреса '&' - возвращает указатель на массив
- функция 'sizeof' возвращает размер всего массива, а вовсе не размер указателя
Автор: wiwiw
Дата сообщения: 08.03.2005 13:57
distance
Я согласен.


Wadimus
правильно будет так:

Имя массива может быть использовано как указатель на его первый элемент.
Автор: mihas83
Дата сообщения: 08.03.2005 14:59
wiwiw

Цитата:
Имя массива может быть использовано как указатель на его первый элемент.

О чем, кстати, пишут даже в большинстве книг.
Автор: IXaosI
Дата сообщения: 14.03.2005 19:06
Народ, не смейтесь, ток учусь..
Вопрос таков по С++ Билдер 6.0
В библиотеке windows.h надо вызвать функцию которая отбражает русские символы в консоли
#include <iostream.h>
#include <windows.h>
char* Rus(char* text);
int main()
{
int i;
cout <<Rus("Приветы") <<endl;
cin >>i;
return 0;
}

Что-то типа такого, или этот код только в Visual??
Если можете приведите пример свой, только по максимуму просто, что бы мне чайнику было понятно, ооооочень прошу, сенкс...

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


Автор: WiseAlex
Дата сообщения: 14.03.2005 19:12
IXaosI
http://forum.ru-board.com/topic.cgi?forum=33&topic=4227&start=280#15
и дальше
Автор: IXaosI
Дата сообщения: 14.03.2005 20:36
WiseAlex
а как насчет

Цитата:
Да и второе, скажите пожалуйста почему после выполнении программы она закрывается,
как можно сделать, что бы консоль оставался, или что бы программа выполнялась заново...???

Автор: vndovr
Дата сообщения: 14.03.2005 21:16
Поставь getchar() в конце main() - будет открыто пока какой-либо символ не введешь
Автор: Karlsberg
Дата сообщения: 15.03.2005 08:05
vndovr
При таком варианте просто Enter не прокатит...
IXaosI
Если хочешь, можешь так извращнуться:

Цитата:
while(!_kbhit())
{
Sleep(300);
}

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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