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

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

Автор: doktorpilulkin
Дата сообщения: 01.03.2012 18:28
когда пишу, все в память стараюсь запихнуть. большой файл конечно так не получится. 32 мб для приложения вполне приемлимо, мазила по полтора гига умудряется жрать.
для совместимости на всех виндах мороки много - кроме того что все системы надо поставить (я сам сделал один раз это и они в образах акрониса валяются) но все равно крайне лениво потом все это обкатывать. хп и семерка уже более чем достаточно
Автор: nick7inc
Дата сообщения: 01.03.2012 18:32
doktorpilulkin

Цитата:
когда пишу, все в память стараюсь запихнуть.

Забыл сказать. Я пока планирую только чтение из архива делать. Писать в один файл двумя потоками - это, конечно, самоубийство.
Автор: bomzzz
Дата сообщения: 01.03.2012 18:54

Цитата:
Писать в один файл двумя потоками - это, конечно, самоубийство.

да ничего особенного, реально они все равно будут по очереди писать

никто случайно такую фигню не знает: когда из Windows XP запускаешь setup Windows 2000, то пишет что версия ниже и установка заблокирована, как это дело обойти?
Автор: Molniev
Дата сообщения: 01.03.2012 20:52
bomzzz
А с какой целью? Win ставить надо загрузившись с диска, а не через графический инсталлятор. Иначе весьма высоки шансы заглохнуть на середине установки.

nick7inc
Конечно и читать и писать файлы через несколько дескрипторов можно (насчет дос не скажу) ). Но я присоединяюсь к akaGM в мнении, что необходимость этого не очень велика. Смысл в чем: система дескриптором поставляет абстракцию, которая и позволяет это делать. Но по факту чтение не является параллельным (головка то у жесткого диска только одна)) ). Система либо все равно прочитает фрагменты последовательно (если они малы) либо будет читать по кускам эти фрагменты (что будет тормозить чтение) метаясь между ними но всеравно сначала дочитает один (прерываясь на второй) потом второй. А поскольку реально все работает последовательно, то необходимость псевдопаралельного чтения/записи в большинстве случаев отсутствует.
Я предполагаю вы делаете распаковку в несколько потоков? Вам разумней тогда читать файл последовательно в одном потоке (ввода-вывода) и используя средства синхронизации, когда блок прочитан разрешать работу с блоком памяти одному из потоков обработки данных. Это оптимальная схема.

Но если скорость для вас не является критическим параметром то конечно можно делать и с несколькими дескрипторами и параллельным чтением. Никаких проблем это не вызовет.

Ну а "...Win95/WinNT..." "...не надо забывать что на количество открытых файлов есть ограничение ... Да, читал. Чуть не забыл." - В unix есть. В windows число фактически ограничено только доступными ресурсами.
Автор: bomzzz
Дата сообщения: 01.03.2012 20:54

Цитата:
А с какой целью? Win ставить надо загрузившись с диска, а не через графический инсталлятор. Иначе весьма высоки шансы заглохнуть на середине установки.

да какие шансы - она под другой виндой только копируется на диск.
я уже понялчто надо в реестре версию переделать
Автор: nick7inc
Дата сообщения: 01.03.2012 22:18
Molniev

Цитата:
Я предполагаю вы делаете распаковку в несколько потоков?

Увы - нет. Я не работаю с многопоточностью и планировал делать (псевдо параллельное) чтение одного файла-архива по кускам разными дескрипторами только для удобства чтения из разных частей архива (последовательное чтение разных файлов в архиве, по кускам). Надеюсь я ясно выразился.

Я понял, что предложенный мною вариант не очень хорош, взять хотя бы ограничение на кол-во одновременно открытых файлов. Думаю, что я буду делить один открытый дескриптор файла-архива.

Добавлено:

Цитата:
В windows число фактически ограничено только доступными ресурсами

Есть, по-моему, у stdio своё ограничение. Видел где-то в описании, надо бы освежить..

Добавлено:
1)Ограничение CRT-библиотеки (можно менять)
_setmaxstdio function Sets a maximum for the number of simultaneously open files at the stdio level.
2) В файле stdio.h есть строчка:
Код: #define FOPEN_MAX (20)
Автор: newbie20
Дата сообщения: 08.03.2012 12:54
[more] [more] [more] всем привет. есть такой вопрос в Си програмировании.
Написал программу с подсчетом букв и их процентов, а так же проверку на ввод букв. Теперь хочу добавить do while элемент... После его добавления программа запускается только один раз, при следующем повоторении просто переходит в else не читая if. Подскажите в чем проблема?
я могу только предположить, что он не читает ввод строки который запрашивается с пользователя:  gets(string);

Вложил только часть кода


Код: int main()
{
    char string[100];                        
    int c=0,i=0,j=0, count[26] = {0};        
    int b[100];                                
    int temp=' ';                            
    int counts;                                
    int length;                                
    int percentage;
char answer;
                            

    do {                    
    printf("Введите строку: \t");            
    gets(string);    
if ((string[i] >= 'a' && string[i] <= 'z') || (string[i] >= 'A' && string[i] <= 'Z'))
{
    printf("Длина строки %u\n",strlen(string));
    length = strlen(string);                                
    for(i=0;i<length;i++)
    {
        for(j=i+1;j<length;j++)
        {
            if( string[i] > string[j] )    
            {    
                temp = string[i];
                string[i] = string[j];
                string[j] = temp;
            }
        }
    }

    j=0;
    for(i=0;i<length;)
    {
        counts=0;
        b[j]=(int)string[i];

        do
        {
            i++;
            counts++;
        }while(string[i]==b[j]);                
        j++;                                    
        printf("Число %c - %d",string[i-1],counts);
        percentage = (counts*100)/length;                                
        printf("\tПроцент %c - %d% \n",string[i-1],percentage);
    }

}
else
{
    printf("Введите только буквы!\n\n");
}
    printf("Хотите повторить нажмите у \t") ;                                
    answer = getchar();                                                
    }while( answer == 'y' );
}
Автор: akaGM
Дата сообщения: 08.03.2012 13:07
newbie20
для начала разберись со счётчиками циклов, у тебя везде используется 'i' и в качестве рабочего и в качестве глобального вот здесь:

int c=0,i=0;
if ((string[i] >= 'a' && string[i] <= 'z') || (string[i] >= 'A' && string[i] <= 'Z'))
Автор: newbie20
Дата сообщения: 08.03.2012 13:23

Цитата:
для начала разберись со счётчиками циклов, у тебя везде используется 'i' и в качестве рабочего и в качестве глобального вот здесь:

int c=0,i=0;
if ((string[i] >= 'a' && string[i] <= 'z') || (string[i] >= 'A' && string[i] <= 'Z'))



int r=0;
if ((string[r] >= 'a' && string[r] <= 'z') || (string[r] >= 'A' && string[r] <= 'Z'))

или я что-то не правильно понял?
я не так давно начал изучать си, поэтому иногда туго доходит.
Автор: akaGM
Дата сообщения: 08.03.2012 14:36
newbie20
всё правильно ты понял, просто этот i у тебя в двух-трёх местах ещё изменялся
for(i=0;i<length;i++) здесь
do
{
i++; //и здесь
counts++;
}while(string[i]==b[j]);

теперь только правильно изменяй свой новый "r" и всё у тебя получится...
Автор: newbie20
Дата сообщения: 08.03.2012 17:07
[more] do while теперь даёт ввести строку, но надо обязательно вводить её после    'y', например 'yТЕСТ',хотя сначало должно показать сообщение:
printf("Enter a string:\t"); а уже потом давать ввод. как это исправить?


Код:
#include<stdio.h>        
#include<string.h>        
#include<ctype.h>        
#include<stdlib.h>        


int main()
{
    char string[100];                        
    int c=0,j=0, count[26] = {0};
    int i=0;
    int r=0;
    int g=0;
    int b[100];                                
    int temp=' ';                            
    int counts;                                
    int length;                                
    int percentage;                            
    char answer;                            

    do {                    
    printf("Enter a string:\t");    
    gets(string);                            
    if ((string[r] >= 'a' && string[r] <= 'z') || (string[r] >= 'A' && string[r] <= 'Z'))
    {
    printf("Length of a string: %u\n",strlen(string));    
    length = strlen(string);                                
    for(g=0;g<length;g++)
    {
        for(j=g+1;j<length;j++)
        {
            if( string[g] > string[j] )
            {    
                temp = string[g];
                string[g] = string[j];
                string[j] = temp;
            }
        }
    }

    j=0;
    printf("\nCharacters counted different:\n\n");
    for(i=0;i<length;)
    {
        counts=0;
        b[j]=(int)string[i];

        do
        {
            i++;
            counts++;
        }while(string[i]==b[j]);
        j++;                                    
        printf("Number of character %c is: %d",string[i-1],counts);    
        percentage = (counts*100)/length;    
        printf("\tPercentage of %c - %d% \n",string[i-1],percentage);
    }

    while ( string[c] != '\0' )                
    {
        if ( (string[c] >= 'a' && string[c] <= 'z') || (string[c] >= 'A' && string[c] <= 'Z'))    
            count[string[c]-'a']++;                
            count[string[c]-'A']++;            
        c++;                                    

    }
    printf("\nBoth lowercase and uppercase characters counted the same:\n\n");

    for ( c = 0 ; c < 26 ; c++ )
    {
        if( count[c] != 0 )

            printf("Number of character %c is : %d\n",c+'A',count[c]);
    }
}
else
{
    printf("\nget a life get the mf life\n\n");
}
    printf("type y to reapeat: \t") ;    
    answer = getchar();                                                
    }while( answer == 'y' );                                                            
}
Автор: akaGM
Дата сообщения: 08.03.2012 20:13
newbie20

замени две строчки
printf("Enter a string:\t"); и
answer = getchar();
на
printf("\nEnter a string:\t");
answer = getch();

на самом деле не понятна логика твоей программы...
что ты, например, отслеживаешь индексом r, который нигде вообще не меняется?
Автор: newbie20
Дата сообщения: 08.03.2012 22:06
akaGM
спасибо. то что нужно.


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


логически он должен проверять на наличие только букв в строке(больших и маленьких), что он и делает по моему(?).
а насчет индекса я пробовал сделать это без него т.е. (string >= 'a' && string <= 'z'), но он мне выдавал и выдаёт лист состоящих из ряда ошибок.
Автор: akaGM
Дата сообщения: 08.03.2012 22:23
newbie20

Цитата:
логически он должен проверять на наличие только букв в строке(больших и маленьких), что он и делает по моему(?)
ну делает... только один раз при старте когда он равен 0, т.е. проверяешь только один первый символ в строке
я бы считал, что его где-то надо r++, чтобы "продвигаться" по строке...
Автор: newbie20
Дата сообщения: 09.03.2012 01:34
akaGM
спасибо за совет. попробую.


p.s. если использовать while то программа ломается после 1ого повтора, т.е. выдаёт ошибку. также дальше по строке он не идёт.

while(string[r] !='\0')
{
if(isalpha(string[r]))
r++;
}

следом попробовал с do while но тоже желаемого не получил.
Автор: akaGM
Дата сообщения: 09.03.2012 11:16
newbie20
так как звучит твоё задание в целом?
попробуй так, иначе всю строку не просканировать...

Код: while(string[r++] != '\0') {
if(isalpha(string[r]))
//а тут что ты хотел делать?
}
Автор: cp58
Дата сообщения: 09.03.2012 11:28
akaGM
Тогда уж так:

Код: do
    if (isalpha(*string))
        /* do something */
while (*string++);
Автор: akaGM
Дата сообщения: 09.03.2012 12:58
у него определение string не подходит для таких манипуляций...
Автор: newbie20
Дата сообщения: 09.03.2012 13:15
akaGM
вывести на экран длину строки, повоторения букв и их процентов, проверить на наличие только букв в встроке.

Автор: akaGM
Дата сообщения: 09.03.2012 14:10
newbie20
ну вот... видно, что основной логический блок -- это сканирование всей строки, которую надо пробежать хотя бы один раз, а у тебя это неочевидно...

всегда лучше начитать кодировать с составления логической блок-схемы программы...
Автор: cp58
Дата сообщения: 09.03.2012 14:14
akaGM

Цитата:
у него определение string не подходит для таких манипуляций...

Виноват, не посмотрел код.
newbie20

Цитата:
вывести на экран длину строки, повоторения букв и их процентов, проверить на наличие только букв в встроке.


Код: void func(char *str) {
    size_t len=0,i=0;
    char freq[26]={0};
    int notonlyletters=0;
    for (;*str;len++,str++)
        if (isalpha(*str))
            if (*str>='a')
                freq[*str-'a']++;
            else
                freq[*str-'A']++;
        else
            notonlyletters=1;
    printf("length = %d \n", len);
    for (;i<26;i++)
        if (freq[i])
            printf("frequency of %c = %d%%, %d count\n", i+'a', (freq[i]*100)/len, freq[i]);
    notonlyletters ? printf("not only letters \n") : printf("only letters \n");
}
Автор: akaGM
Дата сообщения: 09.03.2012 15:21
cp58
ну и что? кто бы сомневался, что ты напишешь...
а как же обучение?
никакой ты не... педагог :)
Автор: newbie20
Дата сообщения: 09.03.2012 16:32
akaGM
учту на будущее.

cp58

мне бы хотелось исправить то, что уже имею, а не лезть в чужое решение.
всё равно спасибо.
Автор: cp58
Дата сообщения: 11.03.2012 03:02
akaGM

Цитата:
а как же обучение?

Здесь на лицо пробел в знании C, поэтому нельзя было адекватно оценить понимание написанного newbie20 и непонятно чему обучать, не зная усвоеной им базы.
newbie20

Цитата:
а насчет индекса я пробовал сделать это без него т.е. (string >= 'a' && string <= 'z'), но он мне выдавал и выдаёт лист состоящих из ряда ошибок.

Вам следует почитать про C строки, так как string лишь указатель и сравнивать его с кодом символа 'a' неправильно.
Автор: akaGM
Дата сообщения: 11.03.2012 12:18
cp58
да понятно всё...
просто я считаю, что сделать "от и до" за человека здесь можно только в случае если он просит:
"
сложить два числа, результат вывести на экран

памагите, плиз!!!
три недели голаву ламаю!!!
"

а в остальном всё-таки объяснять и подталкивать...

ХО
Автор: gygant
Дата сообщения: 11.03.2012 15:25
Здравствуйте! Передо мной стоит следующая задача: написать программку, которая будет скомпоновывать несколько текстовых файлов в один. Список файлов в листбоксе и массиве files_arr.

Код следующий:


Код:
char line_ch[3000];

for (z=0;z<ListBox1->Items->Count;z++)
{
ifstream f(files_arr[z].c_str());

// char line_ch[3000];

for (line;getline(f,line);)
{
strcpy(line_ch,line.c_str());
result_file.write(line_ch,strlen(line_ch));
result_file.write("\n",1);
};

// delete line_ch;
};

Автор: cp58
Дата сообщения: 11.03.2012 17:14
gygant
Между первым и вторым объявлением line_ch лишь одна разница - область видимости и все.
Освобождать эту память вручную не надо, так как она выделена в стеке, ничего лишнего не выделяется, когда подпрограмма отработает задачу память вернется.

У меня вопрос к вам, зачем вобще нужен этот буфер?
Автор: gygant
Дата сообщения: 11.03.2012 17:56
cp58

вот как раз всплыло. Прихожу сейчас с работы домой. Решил скомпоновать два файла по 55 метров каждый. 110 итого. И фигу - программа вылетает. Путем махинаций, мата и прочего развлекалова заработал следующий вариант:


Код:
for (line;getline(f,line);)
{
char line_ch[3000];
strcpy(line_ch,line.c_str());
result_file.write(line_ch,strlen(line_ch));
result_file.write("\n",1);
delete line_ch;
};
Автор: karakurt2
Дата сообщения: 11.03.2012 18:47
gygant
а что будет если длина строки больше 3000 символов?
Автор: gygant
Дата сообщения: 11.03.2012 18:57
karakurt2
Тогда начнутся глюки. Но в моем случае я знаю, что трех тысяч хватит. Двух мало, а трех хватит.
А так можно было бы как-нибудь повыпендриваться через динамическое переопределение величины массива..

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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