Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение конца файла с кодировкой win, 255 символ имеет значение "я" и EOF 
:(
    Опции темы
Xmiler
Дата 11.3.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.12.2006

Репутация: нет
Всего: нет



 Пишу прогу для сдачи в инст-win32 application.
 Обнаружил, что если ставишь букву "я"(код 255) в файле с кодировкой win, то текст после нее урезается (если использивать структу (c=getc(fp1))!=EOF ). Как поступить в таком случае?

 smile     Заранее БОЛЬШОЕ спасибо.
PM MAIL   Вверх
mr.Anderson
Дата 11.3.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



В поиск. Обсуждалось 1482 раза.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
JackYF
Дата 11.3.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Потому что конец файла не определяется буквой.
Нужно использовать функцию feof(FILE*).


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
codelord
Дата 11.3.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



используй вместо 
char c;

int c;


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Xmiler
Дата 11.3.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.12.2006

Репутация: нет
Всего: нет



mr.Anderson,  прошу прощения.


JackYF, спасибо!

 
codelord,  где именно?  я использую putc далее..

  А нафига функция getc(fp) возвращет EOF после конца файла?? Подскажите пожалуйста как этого избежать.
   Пишу программу шифрования файла - каждому символу сопоставлю по некоторому правилу другой символ. А этот EOF все порптит  smile 
   Заранее большое спасибо!

 З.Ы. Найти похожуу тему старался
PM MAIL   Вверх
phprus
Дата 11.3.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 22.8.2006

Репутация: 1
Всего: 3



Xmiler
Функция getc возвращает int, соответственно переменная "c" должна быть типа int. Тогда файл не будет обрезаться на букве "я" при сравнивании "с" с EOF.

putc ожидает символ в виде типа int, так что если переменная "c" будет иметь тип int, то ничего страшного не случится.
PM MAIL WWW ICQ   Вверх
Xmiler
Дата 11.3.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 28.12.2006

Репутация: нет
Всего: нет



codelord
phprus,  Спасибо!!
    Не понял в чем фокус, но все работает! smile 
 Если не трудно, объясните почему(средства отладки к сожалению не знаю): условие unsigned int c; while ((c=getc(fp1))!=EOF) работает хотя EOF=-1 в stdio.h Ведь у меня беззнаковое, да и все возможных 256(дес.) значений заняты ASCII таблицей.  

    Заранее спасибо! 
PM MAIL   Вверх
Любитель
Дата 11.3.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Всё правильно работает. Что возвращает getc?

1. EOF если дошли до конца.
2. Код символа иначе, но (!) типом int.

Если мы имеем char c, то при c = EOF приведёт к тому, что в c запишется 255 (бинарная интерпретация -1 для беззнакового однобайтового типа).



--------------------
PM MAIL ICQ Skype   Вверх
BigHeart
Дата 19.3.2007, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



гляньте, пожалуйста, такой код. тут такие проблемы: CharToOem не пашет при включённом юникоде, и я никак не могу заставить закончить считывание строки, когда достигнут конец файла
Код

void RussianMessage(char *str){
    char message[10000];
    CharToOem(str,message);
    cout<<message;
}

int _tmain(int argc, _TCHAR* argv[])
{
    const int size = 10000;
    char Str[size];
    
    FILE *f;
    f=fopen("D:\\AAA\\\english.txt","r");
    if(f!=NULL)
    {
        for(int i=0;i< size;i++)
        {
            fread(Str,sizeof(Str[i]),size,f);
            //cout << Str[i];
            if(Str[i]==feof(f)){break;Str[i]=EOF;}
        };RussianMessage(Str);}
        else
        printf("File not found");
    return 0;
}

PM MAIL   Вверх
Rockie
Дата 19.3.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



BigHeart, а что программа делает? какие входные данные и что нужно получить в итоге?

Добавлено @ 15:42 
Код

if(f==NULL) { std::cout<<"File not found"; return 1; }

while(!feof(f))
{
   //..
}




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
BigHeart
Дата 19.3.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



нужно просто прочесть из файла английсие слова и их русский перевод

Добавлено @ 15:57 
Цитата

while(!feof(f))

это тоже не помогает
PM MAIL   Вверх
codelord
Дата 19.3.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



ошибки считывания файла точно нет?
"D:\\AAA\\\english.txt"


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
seacat79
Дата 19.3.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 27.2.2007
Где: Украина, Одесса

Репутация: 1
Всего: 1



Код

int _tmain(int argc, _TCHAR* argv[])
{
    const int size = 10000;
    char Str[size];
    
    FILE *f;
    f=fopen("D:\\AAA\\\english.txt","r");
    if(f!=NULL)
    {
        for(int i=0;i< size;i++)
        {
            fread(Str,sizeof(Str[i]),size,f);
            //cout << Str[i];
            if(Str[i]==feof(f)){break;Str[i]=EOF;}
        };RussianMessage(Str);}
        else
        printf("File not found");
    return 0;
}


Не совсем понятно, как он у тебя делает, то, что ты хочешь сделать  smile 

Код

      fread(Str,sizeof(Str[i]),size,f); // Читает в память 10000 байт(или до конца файла) символов из файла f на итерации i=0

Данную операцию зачем-то делаем 10000 раз  smile 


Код

      if(Str[i]==feof(f))  //не понятно что с чем сравнивается


надо так
Код

if (feof(f)) {....} // Достишли конца файла

PM MAIL ICQ   Вверх
BigHeart
Дата 20.3.2007, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 17.3.2007

Репутация: нет
Всего: нет



спасибачки!!!   smile

Добавлено @ 14:53 
я только пол-года С++ учу. Ещё на методе проб и ошибок. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0865 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.