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

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

Автор: newoleg2009
Дата сообщения: 05.09.2009 13:24

Цитата:
Вот только больше одного не получается выделить.


А несколько файлов и не получится выделить: http://support.microsoft.com/kb/314853

Как вариант - когда експлорер откроется - работать с его listview.
Автор: Infinite Retrieval
Дата сообщения: 08.09.2009 21:18
Существует ли в C++ какой-либо перегруженный опрератор/функция приёма ввода с консоли, чтобы она читала строку с прбелами, тобишь как в обычных C - scanf("%s",...); ? Понимаю, что можно просто пользоватьсе тем-же сканф, но просто любопытно...

Добавлено:
katavat
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BD%D1%83%D1%82%D0%B0_%E2%80%94_%D0%9C%D0%BE%D1%80%D1%80%D0%B8%D1%81%D0%B0_%E2%80%94_%D0%9F%D1%80%D0%B0%D1%82%D1%82%D0%B0

Может не совсем то, но почитайте, интересно)
Автор: Lyrik
Дата сообщения: 08.09.2009 21:35
Infinite Retrieval
Если я правильно понял, то метод getline()
Автор: Infinite Retrieval
Дата сообщения: 08.09.2009 21:38
Lyrik
Спасибо, ато в плючас слабо шарю, только изучаю, до этого прогал в pure C и был спокоен, сейчас понял, что жизнь проходит мимо меня

Добавлено:
Да, и ещё вопрос, существет ли метод передачи многомерного массива, как параметр функции? Тобишь требуется передать указатель на massive[0][0][0]....[0], и я тут поэсперементировал, и пришёл к выводу, что компилятор MVS тредует, чтобы рамер последнего измерения был указан, тобишь massive[][][]...[5]. С чем это связанно? Я понимаю, что можно создавать переменную указатель, и передавать её, но всё-же интересно...

Добавлено:
И ещё вопрос. Как я понимаю, на нынешней архитектуре 80\86 нынешние компиляторы пихают все статические переменные в стек, который зачищается только после выхода из функции. Даже простые массивы вроде пихаются в стэк (так ли это?). Вопрос: почему нельзя пихать все статические переменные в сегмент данных? Ведь как я понимаю, нынешние программы пользуются для динамических переменных heapом, доступ к которому идёт через менеджер памяти системы, реализация этой кучи может быть любой (за это разработчики системыотвечают), но как ни крути, архитектура поддерживает наличие сегмента данных, а в реальности я его нигде не видел (ну видел, когда кодил на асме), отрафировался ли он?
Автор: Lyrik
Дата сообщения: 08.09.2009 22:49
Infinite Retrieval
1. По поводу многомерных массивов: как-то не задумывался над этим, передаю указатель и все размерности в функцию и все.
2. По поводу размещения данных: статические переменные - пихаются в сегмент данных, локальные переменные - в стек, динамические - в кучу. Вроде так.
Автор: Infinite Retrieval
Дата сообщения: 08.09.2009 22:59

Цитата:
статические переменные - пихаются в сегмент данных, локальные переменные - в стек, динамические - в кучу.

Точно, забылся просто.
Автор: lYY
Дата сообщения: 09.09.2009 14:10
Подскажите Уважаемые!

Надо прочитать бинарный файл в строку в шестнадцатричном виде.
Т.е. есть файл list.zip, открываем его в HexEdit и видим последовательность:
504B03... и т.д.
Мне нужно такое реализовать на С++.
Чтобы строка AnsiString S после чтения из файла была равна "504B03..."

Делаю:

Код:
wchar_t s[100];

FILE *f;
if ((f=fopen("list.zip","rb"))!=NULL)
{
fscanf(f,"%02X",&s);
fclose(f);
}
Label1->Caption=s;


и получаю на экране "?????????"

(Нужна и обратная задача - сделать из такой строки бинарный файл)
Автор: akaGM
Дата сообщения: 09.09.2009 14:49
lYY
читать строку надо посимвольно или сразу блоком в массив int'ов и уже потом писать в строку
нужным форматом %02X


Цитата:
(Нужна и обратная задача - сделать из такой строки бинарный файл)

используй, например, сразу _write, если знаешь размер буфера:

int buff[100];
_write(f, buff, strsize);
Автор: lYY
Дата сообщения: 09.09.2009 15:24
akaGM

Цитата:
l
читать строку надо посимвольно или сразу блоком в массив int'ов и уже потом писать в строку
нужным форматом %02X


Ну т.е. для первого символа


Код:
int i;

FILE *f;
if ((f=fopen("list.zip","rb"))!=NULL)
{
fscanf(f,"%d",&i);
fclose(f);
}
Label1->Caption= Преобразование (i);
Автор: akaGM
Дата сообщения: 09.09.2009 16:03
lYY

Код: int i, j, k;
int N = 100; // сколько тебе символов надо прочитать?
unsigned char labelStr[N];
unsigned char buff[2*N];

FILE *f;
if ((f=fopen("list.zip","rb"))!=NULL)
{
for (j = 0, k= 0; j < N; j++) {
fscanf(f,"%c", &buff[j]);
sprintf(labelStr[k], "%02X", (unsigned int)buff[j]);
k += 2;
}
fclose(f);
}
Label1->Caption= labelStr;

или так

#include <io.h>
int fh;

if( fh = _open("list.zip", _O_BINARY) != -1 )
{
_read(fh, buff, N);
_close(fh);
}

for (i = 0, j= 0; i < N; i++) {
sprintf(labelStr[j], "%02X", (unsigned int)buff[i]);
j += 2;
}
Label1->Caption= labelStr;
Автор: Abs62
Дата сообщения: 09.09.2009 17:52
lYY

Цитата:
Надо прочитать бинарный файл в строку в шестнадцатричном виде.

Ну, примерно так.

Код: wchar_t s[100],s2[5];
FILE *f;
int i,n;
if ((f=fopen("list.zip","rb"))!=NULL) {
memset(s,0,sizeof(s));
for(i=0;i<49;i++) {
n=fgetc(f);
if(feof(f)) break;
swprintf(s2,L"%02X",n);
wcsncpy(s+i*2,s2,2);
}
}
Автор: akaGM
Дата сообщения: 09.09.2009 19:04
Abs62

Цитата:
Не int'ов, а char'ов.

оговорился, в коде именно так и думалось (без исправлений, как можно видеть)

Цитата:
Этот буфер ещё сформировать надо.

наверняка он знает, что и сколько ему из зипаря надо,
чё-то мне кажется, мы все хором что-то крякаем...

L"%02X"
что означает фигня перед форматом? /жизнь прошла мимо/
Автор: Abs62
Дата сообщения: 09.09.2009 19:11
akaGM

Цитата:
наверняка он знает, что и сколько ему из зипаря надо

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

Цитата:
что означает фигня перед форматом?

Что это строка wchar_t, а не char.
Автор: akaGM
Дата сообщения: 09.09.2009 19:59
Abs62

Цитата:
Что это строка wchar_t, а не char.

какая эта, формат? или преобразуемая?
Автор: Abs62
Дата сообщения: 09.09.2009 20:07
akaGM
Та, которая в кавычках.

"some string" - строка char.
L"some string" - строка wchar_t.
Автор: akaGM
Дата сообщения: 09.09.2009 20:16
Abs62
а прототипы на что? или где?
кстати, ты счётчик куда-то не туда воткнул:
swprintf(s2,L"%02X",n);
int swprintf(wchar_t *buffer, size_t count, const wchar_t *format [, argument]...);
Автор: Abs62
Дата сообщения: 09.09.2009 20:32
akaGM

Цитата:
а прототипы на что? или где?

Какие прототипы?

Цитата:
кстати, ты счётчик куда-то не туда воткнул:

Его там нет вообще.

Цитата:
int swprintf(wchar_t *buffer, size_t count, const wchar_t *format [, argument]...);

MS ввело это только начиная с VC2005, на более ранних версиях счётчик в список параметров не входит. Хотя и должен быть по стандарту.

Автор: akaGM
Дата сообщения: 09.09.2009 20:41
Abs62
хренасе...


Цитата:
Какие прототипы?

не, я действительно не понимаю:
если прототип foo(const wchar_t *s);
то я обязан кастовать?
foo("и какой же я виджины всё-таки?"); -- так не прокатит?
Автор: Abs62
Дата сообщения: 09.09.2009 20:50
akaGM

Цитата:
то я обязан кастовать?

Это не кастинг, это именно задание строки wchar_t. Строковую константу скастовать невозможно, так как по сути это массив элементов, размер которых для char и wchar_t различен. И определяется это на этапе компиляции.

Цитата:
foo("и какой же я виджины всё-таки?"); -- так не прокатит?

Нет, не прокатит.
Автор: akaGM
Дата сообщения: 09.09.2009 20:59
Abs62

Цитата:
Это не кастинг

а...

Цитата:
Строковую константу скастовать невозможно

а в чём сложность?
"ab" -- в массиве два элемента + 0
L"ab" -- четыре + чем там юникод завершается

Цитата:
определяется это на этапе компиляции

тем более что именно константную...
всё равно низзя?
Автор: Abs62
Дата сообщения: 09.09.2009 21:13
akaGM

Цитата:
а в чём сложность?
"ab" -- в массиве два элемента + 0
L"ab" -- четыре + чем там юникод завершается

Вот именно в этом и сложность. foo(const wchar_t *s) требует указатель на строку двухбайтовых символов. Где компилятор его возьмёт, если такой строки нет, а есть лишь строка однобайтовых?
Автор: akaGM
Дата сообщения: 09.09.2009 21:23
Abs62

Цитата:
Где компилятор его возьмёт, если такой строки нет, а есть лишь строка однобайтовых?

а какой ты тогда, на фиг, оптимизирующий компилятор?
вот и распредели на этапе компиляции

ну ладно, низзя, так низзя, не очень-то и хотелось...
Автор: Abs62
Дата сообщения: 09.09.2009 21:33
akaGM
Каким бы оптимизирующим компилятор не был, он не имеет права плевать на явные указания программиста, а программист прямо указал - это строка char.
Автор: Infinite Retrieval
Дата сообщения: 09.09.2009 21:35
Есть ли принципиальная разница между
my_f(int mass[]) {...} и my_f(int *mass){...} ?
Автор: lYY
Дата сообщения: 10.09.2009 07:27
Abs62 и akaGM
Ну вы разошлись!
Работает способом, предложенным Abs62. Спасибо!

(Краткий смысл задачи в том, чтобы текст сжать, а сжатое передать в виде текстового же сообщения а не кракозябр, ну а потом обратно)


Добавлено:
Кстати, получилось, да не совсем.
Обратная задача:

Код:
wchar_t s[60000];
wchar_t s2[5];
memset(s,0,sizeof(s));

FILE *f;
if ((f=fopen("1.txt","rt"))!=NULL)
{
fwscanf(f,L"%s",s);
fclose(f);
}

int i,n;
if ((f=fopen("1.zip","w+b"))!=NULL)
{
wcscpy(s2,L"0x00");
for(i=0;i<wcslen(s)/2;i++) {
wcsncpy(s2+2,s+i*2,2);
n=wcstol(s2,NULL,16);
fputc(n,f);
}
fclose(f);
}
Автор: xterm
Дата сообщения: 10.09.2009 09:47
Infinite Retrieval

Цитата:
Есть ли принципиальная разница между
my_f(int mass[]) {...} и my_f(int *mass){...} ?

Для компилятора - нет, помнится, ещё Страуструп писал что mass[ i ] преобразуется в *(mass+i). А для человека, который будет в этот код добавлять новые фичи, вероятно есть разница.
Автор: Abs62
Дата сообщения: 10.09.2009 10:08
lYY

Цитата:
на входе 1.txt:
50 4В 03 04 14

на выходе 1.zip
50 04 03 04 14

"4В" каким-то образом превращается в "04"

А нечего русские буквы с латинскими путать. 'В' тут русская.

Цитата:
Никак я не понимаю смысл вот таких L"%s" преобразований

Юникодные версии функций требуют юникодную строку формата, потому и L.
Автор: akaGM
Дата сообщения: 10.09.2009 12:55
Abs62
не понял...
есть прототип foo(wchar_t * s);
пишу foo(L"abc") -- всё ясно -- dw 'a',b',b',0 /или как там в юникоде написать?/
а почему не сгенерить тоже самое для foo("abc")?


Цитата:
Каким бы оптимизирующим компилятор не был, он не имеет права плевать на явные указания программиста, а программист прямо указал - это строка char.

ну и дурак этот программист, а компилятор должен давать варнинг типа "type mismatching: char <--> wchar_t"
и генерить что следует...
имхо

lYY

Цитата:
Никак я не понимаю смысл вот таких L"%s" преобразований

а ты запомни как мнемонику "Long string"
тебя ведь уже не смущает, что 2l -- длинное целое, 0x1b -- 27 в десятеричном
или, что && -- лог. and
Си -- он такой, много чего надо просто знать, не задумываясь

"язык пляшущих человечков" (С) мой

Автор: lYY
Дата сообщения: 10.09.2009 15:19
Abs62
Спасибо, помогло, разобрался!
Автор: Abs62
Дата сообщения: 10.09.2009 16:08
akaGM

Цитата:
ну и дурак этот программист,

Ага.

Цитата:
а компилятор должен давать варнинг типа "type mismatching: char <--> wchar_t"
и генерить что следует...

А он и даёт, только не варнинг, а еррор.

Цитата:
имхо

Стандарт C++ имеет другое имхо.
2.13.4 String literals

Цитата:
A string literal is a sequence of characters (as defined in 2.13.2) surrounded by double quotes, optionally
beginning with the letter L, as in "..."or L"...". A string literal that does not begin with Lis an ordi-
nary string literal, also referred to as a narrow string literal. An ordinary string literal has type “array of n
const char” and static storage duration (3.7), where n is the size of the string as defined below, and is
initialized with the given characters. A string literal that begins with L, such as L"asdf", is a wide string
literal. A wide string literal has type “array of n const wchar_t” and has static storage duration, where
n is the size of the string as defined below, and is initialized with the given characters.

4.2 Array-to-pointer conversion

Цитата:
A string literal (2.13.4) that is not a wide string literal can be converted to an rvalue of type “pointer to
char”; a wide string literal can be converted to an rvalue of type “pointer to wchar_t”. In either case,
the result is a pointer to the first element of the array.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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