Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Определение конца файла с кодировкой win


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

 smile     Заранее БОЛЬШОЕ спасибо.

Автор: mr.Anderson 11.3.2007, 13:21
В поиск. Обсуждалось 1482 раза.

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

Автор: codelord 11.3.2007, 14:42
используй вместо 
char c;

int c;

Автор: Xmiler 11.3.2007, 15:16
mr.Anderson,  прошу прощения.


JackYF, спасибо!

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

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

 З.Ы. Найти похожуу тему старался

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

putc ожидает символ в виде типа int, так что если переменная "c" будет иметь тип int, то ничего страшного не случится.

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

    Заранее спасибо! 

Автор: Любитель 11.3.2007, 19:36
Всё правильно работает. Что возвращает getc?

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

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

Автор: BigHeart 19.3.2007, 15:18
гляньте, пожалуйста, такой код. тут такие проблемы: 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;
}

Автор: Rockie 19.3.2007, 15:37
BigHeart, а что программа делает? какие входные данные и что нужно получить в итоге?

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

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

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


Автор: BigHeart 19.3.2007, 15:52
нужно просто прочесть из файла английсие слова и их русский перевод

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

while(!feof(f))

это тоже не помогает

Автор: codelord 19.3.2007, 16:35
ошибки считывания файла точно нет?
"D:\\AAA\\\english.txt"

Автор: seacat79 19.3.2007, 16:38
Код

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)) {....} // Достишли конца файла

Автор: BigHeart 20.3.2007, 14:51
спасибачки!!!   smile

Добавлено @ 14:53 
я только пол-года С++ учу. Ещё на методе проб и ошибок. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)