NAYGER
Участник
Offline
|
|
« Ответ #30 : 08-12-2009 04:25 » |
|
Быстрее будет просто очистить файл и записать туда без сравнивания Конечно, быстрее Но у меня это файл выступает , можно сказать , в качестве БД изображений, поэтому уд Алять из него данные н ИКак нельзя.
|
|
« Последнее редактирование: 08-12-2009 06:45 от Sel »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #31 : 08-12-2009 04:29 » |
|
а ты где-то сказал, что нужно только часть файла перезаписать ? ) Ну ещё вариант - в специальной папке хранить набор файлов с говорящими названиями
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #32 : 08-12-2009 04:45 » |
|
а ты где-то сказал, что нужно только часть файла перезаписать ? ) Не перезаписать, а дописать, если такого массива в txt файле нет в специальной папке хранить набор файлов с говорящими названиями Ну это , как бы , тож е вариант, но придется каждый файл открывать, чт ОБы сравнить массив изображения с txt файлом, не долго ли?
|
|
« Последнее редактирование: 08-12-2009 06:46 от Sel »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #33 : 08-12-2009 05:03 » |
|
так тогда сравнивать и не нужно - записал , затерев предыдущее содержимое файла, да и всё
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #34 : 08-12-2009 05:36 » |
|
так тогда сравнивать и не нужно - записал , затерев предыдущее содержимое файла, да и всё Нельзя так делать. Вот, имеетс я txt файл, если он пуст , записываем массив загруженного bmp изображения. Если он не пуст , проверяем совпадает ли массив изображения с содержимым txt файла, если не совпадает , дописываем файл, если совпадает , выводим результат , стоящий на следующей строке после ( : ). Пусть M - массив изображения Файл пустойM=0100010111 Записываю М в файлФайл примет вид: 0100010111 :5 - где "5" это название изображения Файл не пустой, произвожу сравнение если совпаловывожу 5 на экран Загружаю другой bmp файл с другим изображением. Провожу те же операции. И , таким образом , txt файл должен постоянно пополняться, в общем , должен содержать базу , необходимую для распознания изображений. А если я буду постоянно зат Ирать файл, то что это это за база-то получится
|
|
« Последнее редактирование: 08-12-2009 06:48 от Sel »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #35 : 08-12-2009 05:49 » |
|
да всё нормально: имеется папка "изображения". В ней файлы "5","вид из окна", "10" нужно перезаписать файл "5" - открываем HANDLE CreateFile("изображения\\5.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
- файл автоматом очистится или создастся, если ещё нет файла. И записываем
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #36 : 08-12-2009 06:00 » |
|
Что-то не совсем понимаю, для чего файл очищать? И еще, названия изображений может повторятся, меняться будет только вид матрицы изображения. Т.е. bmp с нарисованной пятеркой будет выглядеть так: 01111010000100001110000010000101110 :пять
1111100010001110000100011110 :пять
Я так понял в вашем случае файл 5.txt все равно придется дописывать, чтоб он принял вид: 01111010000100001110000010000101110
1111100010001110000100011110
Поэтому наверно все-таки надо остановиться на записи всех изображений в один txt файл?
|
|
« Последнее редактирование: 08-12-2009 06:06 от NAYGER »
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #37 : 08-12-2009 06:37 » |
|
Этот вариант работает, если изображение состоит из 1 пикселя ... for(y=0;y<bmp.bmHeight;y++) { for(x=0;x<bmp.bmWidth;x++) {
char *buffer = new char[(x + 2) * y + 1]; char *next = buffer;
*next = ::GetPixel(hdc, x, y) != 0 ? '0' : '1'; next++; *next = 0; //fputs(buffer, file);
while (fscanf(mFile, "%s\t:%s\t", f1, f2) == 2) { if (!strcmp(f1, buffer)) //посимвольное сравнение строк { UpdateData(true); S=f2; UpdateData(false); } } fclose(mFile); } } ... Я же говорю, что buffer сохраняет и выводит по одному символу в файл, а не целиком строку. buffer=1 - запись в txt buffer=0 - запись в txt buffer=1 - запись в txt buffer=1 - запись в txt и т.д. А вот если бы он имел вид buffer=1011 и т.д. - запись в txt то все бы работало как надо. Как бы сделать чтоб buffer сохранял всю строку массива изображения и вынести его циклы for?
|
|
« Последнее редактирование: 08-12-2009 06:39 от NAYGER »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #38 : 08-12-2009 06:48 » |
|
да ничего не надо дописывать. А поменялось имя - переименуй файл )) В общем, делай, как нравится. а сравниваешь как ? По идее: if(0==strcmp(f1, buffer)) { строки одинаковые } else { строки разные }
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #39 : 08-12-2009 06:56 » |
|
Ну да, только f1 это получается строка в файле, а buffer каждый раз содержит по 1 символу, вот и не получается правильного сравнения
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #40 : 08-12-2009 07:15 » |
|
вот я тебе и говорю - не проще ли разбить на отдельные файлы ? )) Или мудрить подобие базы данных.
|
|
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 08-12-2009 07:57 » |
|
да я на работе, нет времени разбираться. Это ж надо проецировать файл, потом обеспечивать вставку новых данных в середину файла. Да и мало ли что ещё всплывёт ))
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #43 : 08-12-2009 08:06 » |
|
Во-во, а я про что говорю. Приходится работать с тем, что есть. Может, если попробовать как-то char *buffer = new char[(x + 2) * y + 1]; char *next = buffer; вынести перед for, то произойдет чудо Хотя маловероятно. ... for(y=0;y<bmp.bmHeight;y++) { for(x=0;x<bmp.bmWidth;x++) { char *buffer = new char[(x + 2) * y + 1]; char *next = buffer; ...
|
|
« Последнее редактирование: 08-12-2009 08:23 от NAYGER »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #44 : 08-12-2009 08:33 » |
|
а почему именно x+2 ? попробуй так DWORD dwdBufLen=bmp.bmHeight*bmp.bmWidth; char* buffer = new char[dwdBufLen+1];//+1 для zt ::memset(buffer,0,dwdBufLen+1);//zt не забываем обнулить!!!
char* buffer_current=buffer; for(y=0;y<bmp.bmHeight;y++) { for(x=0;x<bmp.bmWidth;x++) { *buffer_current=<символ>; buffer_current++; } } buffer_current=0;
//запись буфера ...
//удаление delete [] buffer; buffer=0;
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #45 : 08-12-2009 09:05 » |
|
DWORD dwdBufLen=bmp.bmHeight*bmp.bmWidth; char* buffer = new char[dwdBufLen+1];//+1 для zt ::memset(buffer,0,dwdBufLen+1);//zt не забываем обнулить!!!
char* buffer_current=buffer; for(y=0;y<bmp.bmHeight;y++) { for(x=0;x<bmp.bmWidth;x++) { *buffer_current=::GetPixel(hdc, x, y) != 0 ? '0' : '1'; buffer_current++; } } buffer_current=0;
while (fscanf(mFile, "s\t:%s\t", f1, f2) == 2) { if (0==strcmp(f1, buffer)) //посимвольное сравнение строк { UpdateData(true); S=f2; UpdateData(false); } } fclose(mFile);
//удаление delete [] buffer; buffer=0; При таком виде, запись в файл проходит, правильно. Да что такое, спасибо Алексей1153++, buffer стал заполняться как надо, но не хочит строка сравниваться и все. Код для сравнения, работает, а при связи с вышеописанным кодом поле static ничего не выводит: FILE *mFile; char f1[10000], f2[10000]; char patt[10000]= "01011001001001001000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000001111111111111111111111111111110000 0000000000000000000000000000011111111111111111111111111111111111111111000000 00000000000000000000000000000000000000000000000000001"; mFile = fopen ("file.txt","r"); //if (0==(mFile = fopen("file.txt", "r"))) //return 1; if( mFile != 0 ) { while (fscanf(ifp, "%s\n:%s\n", f1, f2) == 2) { if (0==strcmp(f1, patt)) //посимвольное сравнение строк { UpdateData(true); S=f2; UpdateData(false); } } } fclose(mFile); }
|
|
« Последнее редактирование: 08-12-2009 09:46 от NAYGER »
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #46 : 08-12-2009 10:14 » |
|
Заметил такую штуку, если забанить всю программу и оставаить: void CMyDlg::OnButton1() { } потом помесьтить сюда, код для сравнения см.выше, то на экран ничего не выводится . Хотя в отдельно созданной программе все работает как надо. Попробую по новой проект пересоздать ...
|
|
« Последнее редактирование: 08-12-2009 10:17 от NAYGER »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #47 : 08-12-2009 10:18 » |
|
а ты в отладчике уже остановился на строке if(0==strcmp(... и посмотрел, ЧТО в этот момент находится в строках ?
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #48 : 08-12-2009 10:36 » |
|
В общем если в оригинале смотреть Build->Start debug->Run to Cursor то там много всего выводится и в итоге результат правильный.
А если смотреть в этой программе, то ничего не выводится кроме: Name:This Value:CXX0017: Error: symbol "this" not found
Даже сказал бы, что вообще ничего.
P.S. - может исходник скинуть?
|
|
« Последнее редактирование: 08-12-2009 10:44 от NAYGER »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #49 : 08-12-2009 10:48 » |
|
я запутался - какой "оригинал" , какая "эта программа" ? )) При чём тут this , совсем загадочно
Исходник прицепи к посту
Какая среда разработки, кстати ?
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #50 : 08-12-2009 11:02 » |
|
Среда - Visual C++.
|
1.rar (54.99 Кб - загружено 735 раз.)
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #51 : 08-12-2009 11:10 » |
|
Жестоко. Лёш, проект сделан в твоей любимой шохе.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #52 : 08-12-2009 11:33 » |
|
NAYGER, какой проект смотреть - "Файл" или "Распознавание" ?
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #53 : 08-12-2009 11:50 » |
|
Распознавание
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #54 : 08-12-2009 12:07 » |
|
поясни, что должно происходить вот в этой строчке
fscanf(mFile, "s\t:%s\t", f1, f2)
потому что я никогда этой функцией не пользовался.
и точно ли тут "s" в начале, а не "%s"
В общем, вертает она у тебя -1 , в цикл не заходим вообще
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #55 : 08-12-2009 13:28 » |
|
поясни, что должно происходить вот в этой строчке fscanf(mFile, "s\t:%s\t", f1, f2) Эту функцию в нете нашел и она работает Я же там специально второй проект прикрепил, чтоб вы глянули, как работает та часть программы отвечающая за поиск в файле, и вывод на экран. f1 - это получается первая строка с которой производится сравнение, а f2 - это строка в которой после знака ( : ), стоит значение которое выводится на экран. потому что я никогда этой функцией не пользовался. Ну если предложешь свой вариант, я буду не против, главное чтоб он работал как надо и точно ли тут "s" в начале, а не "%s" Да, извеняюсь тут будет не "s", а "%s" .
|
|
|
Записан
|
|
|
|
NAYGER
Участник
Offline
|
|
« Ответ #56 : 08-12-2009 13:37 » |
|
Все заработало!!! Алексей1153++, респепектищище тебе и точно ли тут "s" в начале, а не "%s" Из-за не поставленного "%" не работала прога. Все пойду спать
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #57 : 08-12-2009 15:15 » |
|
Ну если предложешь свой вариант, я буду не против
я привык апишными функциями файл доставать )) CreateFile - открыть/создать WriteFile/WriteFileEx - записать в файл ReadFile/ReadFileEx - читать из файла SetFilePointer/SetFilePointerEx - установить указатель в файле
|
|
|
Записан
|
|
|
|
yudjin
|
|
« Ответ #58 : 28-05-2010 05:53 » |
|
Раз тема зашла о файлах - SetFilePointer/SetFilePointerEx - установить указатель в файле. у CFile есть метод GetPosition() - позиция указателя в файле. Как что-то подобное узнать, если работаешь с дескриптором файла через АПИ??
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #59 : 28-05-2010 06:08 » |
|
наверное, так проканает )
DWORD CurrPtr= SetFilePointer(hFile,0,0,FILE_CURRENT);
|
|
|
Записан
|
|
|
|
|