Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    День добрый. Пишу на C++ (MinGW), пользуюсь stdio для чтения/записи  в файлы. Скажите, корректно из одной программы дважды открыть файл на чтение? Влияет ли операционная система на эту возможность (DOS/Win95/WinNT/...)?

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 11:37 01-03-2012
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    нужно при открытии установить флаги возможного совместного доступа к файлу для чтения и для записи (отдельно). DOS - отдельная песня. а с виндой надо использовать апи функции поддерживаемые всеми системами, только с мсдн совсем недавно убрали информацию о поддержке ниже 2000-ка pro
     
    Добавлено:
    хотя если писать дос программу она то как раз будет работать с файлами во всех системах, сходу не вспомню о совместном доступе, ограничение будет файлы до 4 гиг

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 11:43 01-03-2012 | Исправлено: bomzzz, 11:44 01-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
    интересно узнать необходимость такого открытия...
    забыл, что туда раньше написал? :)
    может тебя устроил бы режим а+ и fseek(), rewind() и fsetpos()

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 12:05 01-03-2012 | Исправлено: akaGM, 12:06 01-03-2012
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    очень необходимая вечь - например позволяет качать двумя торрент клиентами один файл с разных трекеров, или качать один файл из интернета менеджером закачки и торрент клиентом, смотреть недокачанный фильм в плеере, чиать в блокноте пишушийся лог ...

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 12:09 01-03-2012 | Исправлено: bomzzz, 12:10 01-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Скажите, корректно из одной программы дважды открыть файл на чтение?


    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 12:35 01-03-2012
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    и чего тут может быть некорректного, не нужно будет каждый раз туда сюда дергать указатель. только не надо забывать что на количество открытых файлов есть ограничение

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 13:05 01-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    по мне, так у товарища хромает логика работы с данным файлом, а не техника его многократного открытия для однотипных операций...

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 18:14 01-03-2012
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bomzzz

    Цитата:
    ограничение будет файлы до 4 гиг

    У меня сейчас запросы поменьше. Пишу под MinGW, там это ограничение легко обходится в STDIO.  
    akaGM

    Цитата:
    интересно узнать необходимость такого открытия...  

    Пожалуйста. Я пишу полиморфный тип UFILE *f, который при помощи знакомых функций stdio (fopen(), fwrite, fread(), fseek(), fprintf(), fscanf() и т.д.) оперирует с данными практически из любого места: файл на диске, буффер в памяти, ... Сейчас мне надо сделать чтение из ZIP архива. А читать иногда приходится параллельно 2 разных файла из архива. Чтобы не морочиться с fseek() (туда-сюда), как раз нужно чтение из одного файла параллельными потоками.
     
    Код
     
    Добавлено:
    bomzzz

    Цитата:
    не надо забывать что на количество открытых файлов есть ограничение

    Да, читал. Чуть не забыл.
    akaGM

    Цитата:
     у товарища хромает логика работы с данным файлом

    Возможно. Я пока не нашёл универсальное решение. Я могу считать в память файл целиком, и от туда через тот же UFILE * передать получателю. Но это годится для небольших файлов. А если файл большой?
     
    Предложите свой вариант.

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 20:19 01-03-2012 | Исправлено: nick7inc, 20:30 01-03-2012
    doktorpilulkin

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    когда пишу, все в память стараюсь запихнуть. большой файл конечно так не получится. 32 мб для приложения вполне приемлимо, мазила по полтора гига умудряется жрать.
    для совместимости на всех виндах мороки много - кроме того что все системы надо поставить (я сам сделал один раз это и они в образах акрониса валяются) но все равно крайне лениво потом все это обкатывать. хп и семерка уже более чем достаточно

    Всего записей: 2341 | Зарегистр. 30-08-2010 | Отправлено: 20:28 01-03-2012
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    doktorpilulkin

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

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

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 20:32 01-03-2012
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

    да ничего особенного, реально они все равно будут по очереди писать
     
    никто случайно такую фигню не знает: когда из Windows XP запускаешь setup Windows 2000, то пишет что версия ниже и установка заблокирована, как это дело обойти?

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 20:54 01-03-2012
    Molniev

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bomzzz
    А с какой целью? Win ставить надо загрузившись с диска, а не через графический инсталлятор. Иначе весьма высоки шансы заглохнуть на середине установки.
     
    nick7inc
    Конечно и читать и писать файлы через несколько дескрипторов можно (насчет дос не скажу) ). Но я присоединяюсь к akaGM в мнении, что необходимость этого не очень велика. Смысл в чем: система дескриптором поставляет абстракцию, которая и позволяет это делать. Но по факту чтение не является параллельным (головка то у жесткого диска только одна)) ). Система либо все равно прочитает фрагменты последовательно (если они малы) либо будет читать по кускам эти фрагменты (что будет тормозить чтение) метаясь между ними но всеравно сначала дочитает один (прерываясь на второй) потом второй. А поскольку реально все работает последовательно, то необходимость псевдопаралельного чтения/записи в большинстве случаев отсутствует.
    Я предполагаю вы делаете распаковку в несколько потоков? Вам разумней тогда читать файл последовательно в одном потоке (ввода-вывода) и используя средства синхронизации, когда блок прочитан разрешать работу с блоком памяти одному из потоков обработки данных. Это оптимальная схема.
     
    Но если скорость для вас не является критическим параметром то конечно можно делать и с несколькими дескрипторами и параллельным чтением. Никаких проблем это не вызовет.
     
    Ну а "...Win95/WinNT..." "...не надо забывать что на количество открытых файлов есть ограничение ... Да, читал. Чуть не забыл." - В unix есть. В windows число фактически ограничено только доступными ресурсами.

    Всего записей: 176 | Зарегистр. 13-03-2008 | Отправлено: 22:52 01-03-2012
    bomzzz



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

    да какие шансы - она под другой виндой только копируется на диск.
    я уже понялчто надо в реестре версию переделать

    Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 22:54 01-03-2012
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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)

       В файле io.h есть строчка:
    Код:
    #define  HANDLE_MAX  FOPEN_MAX

    Не похоже, что можно менять в данном случае.... (OPEN_MAX - из той же оперы)
     
    Добавлено:
    Всем спасибо за замечания и предложения.

    ----------
    Джин, не лезь в бутылку.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 00:18 02-03-2012 | Исправлено: nick7inc, 00:33 02-03-2012
    newbie20

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее... [/more] [/more]

    Всего записей: 7 | Зарегистр. 08-03-2012 | Отправлено: 14:54 08-03-2012 | Исправлено: newbie20, 15:03 08-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    newbie20
    для начала разберись со счётчиками циклов, у тебя везде используется 'i' и в качестве рабочего и в качестве глобального вот здесь:
     
    int c=0,i=0;
    if ((string[i] >= 'a' && string[i] <= 'z') || (string[i] >= 'A' && string[i] <= 'Z'))

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 15:07 08-03-2012
    newbie20

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    для начала разберись со счётчиками циклов, у тебя везде используется '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'))
     
    или я что-то не правильно понял?
    я не так давно начал изучать си, поэтому иногда туго доходит.

    Всего записей: 7 | Зарегистр. 08-03-2012 | Отправлено: 15:23 08-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    newbie20
    всё правильно ты понял, просто этот i у тебя в двух-трёх местах ещё изменялся
    for(i=0;i<length;i++) здесь
            do
            {
                i++;   //и здесь
                counts++;
            }while(string[i]==b[j]);                
     
    теперь только правильно изменяй свой новый "r" и всё у тебя получится...

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 16:36 08-03-2012
    newbie20

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее...

    Всего записей: 7 | Зарегистр. 08-03-2012 | Отправлено: 19:07 08-03-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    newbie20
     
    замени две строчки
    printf("Enter a string:\t"); и
    answer = getchar();
    на
    printf("\nEnter a string:\t");
    answer = getch();
     
    на самом деле не понятна логика твоей программы...
    что ты, например, отслеживаешь индексом r, который нигде вообще не меняется?

    Всего записей: 24114 | Зарегистр. 06-12-2002 | Отправлено: 22:13 08-03-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru