Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2011, 12:34   #1
Cats_foot
 
Регистрация: 06.12.2011
Сообщений: 8
По умолчанию Чтение файла в UTF-8(без BOM)

Доброго времени суток форумчане. Есть такая задача: Имеются лог файлы, нужно найти определенные слова в строке, далее сохранить в отдельный файл название файла, строку и номер строки. файлы в ZIP архиве в кодировке UTF-8(без BOM).

Вопрос собственно в том, как прочитать файл в кодировке UTF-8(без BOM) ?
В C++ я новичок, как и в программирование всего 3 недели. Ищу нужные мне слова вот таким способом:

Код:
setlocale(LC_ALL,"russian");
    FILE* log_file;
    FILE* result_file;
    char current_str[100000];

	if(!(log_file=fopen("c:\\test\\123\\log.txt", "r")))
    {
        printf("Open log_file failed.\n");
		_getch();
        return 0;
    }

	result_file=fopen("c:\\test\\123\\res.txt", "w");

    fin: while(!(feof(log_file)))
    {
        fgets(current_str, 100000, log_file);

        if (ferror(log_file))
        {
            printf("error");
            return 0;
        }

        if (((strstr(current_str,"Слово1"))!=NULL)&&((strstr(current_str,"Слово2"))!=NULL))
        {
            fputs(current_str, stdout);
            fputs(current_str, result_file);

        }
        
    }
_getch();
    fclose(log_file);
    fclose(result_file);
В общем хелп люди добрые.
Cats_foot вне форума Ответить с цитированием
Старый 06.12.2011, 12:40   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

BOM нужен только для того, чтобы понять, какая в файле кодировка (UTF-8, UTF-16, etc) и в каком она формате (LE/BE). Если формат и так известен, BOM не нужен.

Далее, чтобы сравнивать UTF-8 строку с образцом, нужно либо образец перевести в UTF-8, или, что лучше, исходный текст преобразовать в кодировку образца. В винде для этого есть WideCharToMultiByte() и MultiByteToWideChar() соответственно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 06.12.2011, 13:10   #3
Cats_foot
 
Регистрация: 06.12.2011
Сообщений: 8
По умолчанию

Спасибо за разъяснение про BOM. А насчет функции WideCharToMultiByte() не могли ли привести пример, а то в MSDN я никак не могу с ним разобраться(
Cats_foot вне форума Ответить с цитированием
Старый 06.12.2011, 13:19   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Cats_foot

если у тебя Visual Studio 2005 или выше, есть способ проще:

FILE* fp = _wfopen(L"log.txt", L"rt, ccs=UTF-8");
...
fgetws(...);

преобразование char -> wchar будет произведено автоматически.

Последний раз редактировалось Rififi; 06.12.2011 в 13:25.
Rififi вне форума Ответить с цитированием
Старый 06.12.2011, 14:01   #5
Cats_foot
 
Регистрация: 06.12.2011
Сообщений: 8
По умолчанию

У меня VS 2008, а вот char в wchar у меня преобразовываться никак не хочет.

пишет "error C2664: 'fgetws' : cannot convert parameter 1 from 'char [10000]' to 'wchar_t *'
Cats_foot вне форума Ответить с цитированием
Старый 06.12.2011, 14:05   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дык читать то надо в wchar_t, а не в char.
я раньше вообще руками реализовывал чтение UTF8 файлов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.12.2011, 14:19   #7
Cats_foot
 
Регистрация: 06.12.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
дык читать то надо в wchar_t, а не в char.
я раньше вообще руками реализовывал чтение UTF8 файлов.
Ну я даже не представляю как это пока что)) хотя пытался подключить библиотеки с готовыми перекодировками UTF-8 мельком видел что там.

Как я понимаю при чтение wchar_t мне нужно изменить fputs на fputws ?
но в любом случае возникает еще одна ошибка с аргументами: error C2665: 'strstr' : none of the 2 overloads could convert all the argument types Немного покопавшись отключил Юникод... не помогло(
Cats_foot вне форума Ответить с цитированием
Старый 06.12.2011, 14:28   #8
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Cats_foot

Как я понимаю при чтение wchar_t мне нужно изменить fputs на fputws ?
но в любом случае возникает еще одна ошибка с аргументами: error C2665: 'strstr' : none of the 2 overloads could convert all the argument types Немного покопавшись отключил Юникод... не помогло(


не только fputs, но все функции, работающие со строками.
символы, закодированный в utf-8, могут не влезать в размер char (напримре русские символы - уже не влезают), поэтому тебе по-любому придется иметь дело с wchar_t. соответственно юзать wide-аналоги функций, например wcsstr и пр. подробнее смотри в msdn
Rififi вне форума Ответить с цитированием
Старый 06.12.2011, 14:32   #9
Cats_foot
 
Регистрация: 06.12.2011
Сообщений: 8
По умолчанию

Цитата:
не только fputs, но все функции, работающие со строками.
символы, закодированный в utf-8, могут не влезать в размер char (напримре русские символы - уже не влезают), поэтому тебе по-любому придется иметь дело с wchar_t. соответственно юзать wide-аналоги функций, например wcsstr и пр. подробнее смотри в msdn
Спасибо, как раз то что я хотел услышать... полез в MSDN разбираться.
Cats_foot вне форума Ответить с цитированием
Старый 06.12.2011, 15:02   #10
Cats_foot
 
Регистрация: 06.12.2011
Сообщений: 8
По умолчанию

Всем огромное спасибо. Прочитал в этой кодировке) Буду дальше разбираться со своей программой, надеюсь не сильно буду вам докучать вопросами, хотя их еще много.
Тему можно закрыть.
Cats_foot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразовние Utf-16 <=> Utf-8 hard-t Общие вопросы C/C++ 1 26.08.2011 13:54
Работа с BOM Sparky PHP 9 03.12.2009 08:30
Excel VBA, Экспорт в txt, кодировка файла UTF-16 LE/UCS-2 Little Endian+еще один интересный вопрос Maxximus Microsoft Office Excel 17 04.09.2009 20:03
Перезапись файла без путя или определение расположения файла программы The Best Общие вопросы Delphi 4 13.07.2009 22:50