Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.95
Neonjke
18 / 18 / 1
Регистрация: 08.10.2009
Сообщений: 94
#1

Обработка .txt кодировка ANSI и UTF-8 (буква "я" в ANSI воспринимается как EOF) - C++

06.07.2011, 23:08. Просмотров 4881. Ответов 19
Метки нет (Все метки)

Есть следующий кусок кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
FILE* fp = fopen("G:\OPND1.txt", "r");
 
    if (fp!=NULL) // если файл удалось открыть
    {   while((ch = getc(fp)) != EOF) 
            str_file[i++]=ch; 
    
            str_file[i] = '\0';  
            cout << str_file << endl;
    }
    else printf("ERROR!");
 
    fclose(fp);
    system("Pause");
Ситуация следующая - если файл OPND1.txt (он состоит как из русских так и из латинских символов) в формате UTF-8 - то все отрабатывает как и рассчитано.
Если OPND1.txt - в формате ANSI - то текст выводится не полностью, а если быть точным, до первой буквы "я", которая на вывод не попадает, а вместо нее компилятор принимает EOF (Visual Studio 2010).

Что не так? Как исправить? Пожалуйста, помогите...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2011, 23:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка .txt кодировка ANSI и UTF-8 (буква "я" в ANSI воспринимается как EOF) (C++):

Unicode, UTF-8 и ANSI в одном консольном приложении. Можно ли "на лету" конвертировать массив строк? - C++
Всем доброго дня) Подскажите такую весчь: можно ли в консольном приложении работать с несколькими кодировками? Нужно считать файлик в...

Ошибка "ANSI C++ forbids implicit conversion from void* in initialization" - C++
код списка с последовательным хранением рабочий (взят из лабы).но там и cnt и bilet *list - переменные глобальные.я добавил функцию...

Перевод из кодировки UTF - 8 в ANSI - C++
Всем привет! Пишу прогу на линухе, результаты работы вывожу в html файл. Так вот когда открываю файл для прочтения с помощью браузера там...

Чтение из памяти и преобразование UTF-8 в ansi - C++
День добрый подскажите как написать правильно. Считываю из приложения допустим char ник; D0 A7 D0 B8 D0 BD D0 B3 D0 B8 D1 81 D1 85...

Проверить, встрачается ли в заданном тексте буква "а" чаще, чем буква "b" - C++
задача: Напечатать true, если в заданном тексте буква &quot;а&quot; встречается чаще чем буква &quot;b&quot;, и напечатать false в противном случае. Помогите...

Текстовый файл UTF-8 сохранить как текстовый файл ANSI - C++
Есть текстовый файл в UTF-8 Нужно рядом сохранить его же, но в ANSI Как сделать это средствами c++? Среда Visual Studio 2010 ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,385
Завершенные тесты: 1
06.07.2011, 23:12 #2
Цитата Сообщение от Neonjke Посмотреть сообщение
FILE* fp = fopen("G:\OPND1.txt", "r");
fopen не найдет такого файла. нужно:
C
1
FILE* fp = fopen("G:\\OPND1.txt", "r");
и еще попробуйте читать его в бинарном режиме или используйте функцию feof().
Neonjke
18 / 18 / 1
Регистрация: 08.10.2009
Сообщений: 94
06.07.2011, 23:16  [ТС] #3
Цитата Сообщение от schdub Посмотреть сообщение
fopen не найдет такого файла. нужно:
C
1
FILE* fp = fopen("G:\\OPND1.txt", "r");
и еще попробуйте читать его в бинарном режиме или используйте функцию feof().

fopen прекрасно находит этот файл как и в моем, так и в Вашем варианте (возможно, это особенности среды Visual Studio).
бинарный попробую, но все таки мне интересна причина это проблемы, почему "я" интерпретируется как EOF.
Замечу, что когда файл в UTF-8 или в Unicode такой проблемы не наблюдается.

Кто ответит, пожалуйста?
zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:17 #4
Используй функцию feof(). Например цикл while(!feof(fp)) будет итерироваться до конца файла
Neonjke
18 / 18 / 1
Регистрация: 08.10.2009
Сообщений: 94
06.07.2011, 23:27  [ТС] #5
Не особо представляю, как должен выглядеть мой код с feof()
Куда там вставить счетчик?

Не могли бы пожалуйста переделать мой код с feof? Чтобы выполнялось то же самое.
zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:29 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    FILE* fp = fopen("G:\OPND1.txt", "r");
 
        if (fp!=NULL) // если файл удалось открыть
        {       while(!feof(fp)) {
                        ch = getc(fp)
                        str_file[i++]=ch;
 
                        str_file[i] = '\0';
                        cout << str_file << endl;
        }
        else printf("ERROR!");
 
        fclose(fp);
        system("Pause");
Как-то так
Neonjke
18 / 18 / 1
Регистрация: 08.10.2009
Сообщений: 94
06.07.2011, 23:31  [ТС] #7
Благодарю.
В действительности вопрос от моей лени, поправил как у вас, но забыл запихнуть в цикл строчку
ch = getc(fp)

И дивился ошибкам. =)
zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:32 #8
Бывает
schdub
2946 / 1290 / 238
Регистрация: 19.01.2009
Сообщений: 3,385
Завершенные тесты: 1
06.07.2011, 23:34 #9
zuq, строка 7 пропущен }
zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
06.07.2011, 23:36 #10
schdub, Да пропущен. Как-то не обратил внимания. Я в исходный код от автора просто feof() подставил, за другим уже не следил
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
07.07.2011, 00:45 #11
Сдаётся мне, что в самой первой программе ch объявлен как char, потому как если бы он был объявлен как int, то и с первым кодом проблемы бы не было.
Bers
Заблокирован
07.07.2011, 01:00 #12
Цитата Сообщение от grizlik78 Посмотреть сообщение
Сдаётся мне, что в самой первой программе ch объявлен как char, потому как если бы он был объявлен как int, то и с первым кодом проблемы бы не было.
странно... ANSI же 1 байтовый. Не нужен для него никакой int
Может ТС ANSI с юникодом попутал?
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
07.07.2011, 01:07 #13
Bers, ничего ни я, ни ТС не путали. Функция (f)getc() возвращает именно int. Угадай, почему? Потому, что иначе нет никакой возможности отличить признак конца файла (EOF == -1) от символа с кодом 255 (что для знакового char тоже -1).
Bers
Заблокирован
07.07.2011, 01:22 #14
Цитата Сообщение от grizlik78 Посмотреть сообщение
Bers, ничего я не путал. (f)getc() возвращает именно int. Угадай, почему? Потому, что иначе нет никакой возможности отличить признак конца файла (EOF == -1) от символа с кодом 255 (что для знакового char тоже -1).
Ну во-первых, я не говорил, что вы что-то попутали. Вы же не ТС.

А во вторых, getc() действительно возвращает int, но она полностью совместима с ANSI Си.
Это значит, что ... приведение int к unsigned char должно быть без потерь данных.

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

Добавлено через 2 минуты
не не, я что-то похоже сам туплю.

беззнаковый чар тут тоже не вопрёццо. Нет, нужно юзать int без всяких приведений. И не париццо.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
07.07.2011, 01:31 #15
Во-первых, char по-умолчанию почти везде знаковый. Мало где можно встретить беззнаковый char по-умолчанию.
Во-вторых, если бы можно было бы сохранить всю информацию в char, то getc() и возвращала бы char. И знаковость здесь роли не играет.
В коде:
C
1
2
char ch;
while ((ch = getc(fp)) != EOF)
потеря информации происходит как раз при присвоении значения переменной ch, так как для "законных" символов эта функция возвращает числа 0—255, а в случае конца файла, функция возвращает EOF, то есть -1. После присваивания нельзя отличить EOF от символа с кодом 255.
А вот здесь можно:
C
1
2
int ch;
while ((ch = getc(fp)) != EOF)
Добавлено через 2 минуты
Что-то я долго пишу и тоже не сразу понимаю некоторые фразы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2011, 01:31
Привет! Вот еще темы с ответами:

Работа с файлами (вывести в текстовый файл "g.txt" любую цифру из исходного файла "f.txt" с сохранением строгого порядка) - C++
Помогите с задачей. Надо вывести в текстовый файл &quot;g.txt&quot; любую цифру из исходного файла &quot;f.txt&quot; с сохранением строгого...

Char *(UTF-8) -> char *(ANSI) - C++
Есть строка в кодировке UTF-8(если не ошибаюсь) типа char * Вот так ее я вижу в MSVC++10 - комментарии(оригинал - комментарии)...

Ввести с клавиатуры строку, заменить в ней все буква "а" на букву "b" - C++
Здравствуйте) Вот возникла такая проблема.... не умею работать с указателями еще(( Помогите написать задачку: &quot;используя указатели,...

Как конвертировать Unicode в Ansi? - C++
Я написал свою функцию конвертирования из Unicode в Ansi, но она не правильно кодирует символы русского языка. Как такое исправить? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.07.2011, 01:31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru