LINUX.ORG.RU

Не работает условие !EOF.


0

0

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#include <fcntl.h>
#include <unistd.h>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
char s;
char file_name[] = "/home/alexandr/Desktop/.directory";
int file = open (file_name,O_RDONLY);
while (!EOF)
{
read(file, &s, sizeof(s));
cout << s;
}
cout << "\n";
return EXIT_SUCCESS;
}

вот собсно какая проблема, почему то не работает !EOF, т.е. файл не читается в цикле если условие задано как while (!EOF) при этом если задать какое то другое условие, ну там типа

............
int n = 100;
while (n != 0)
{
............
n--;
}
............

то всё читается.
Может кто знает почему это условие не работает.

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

★★★★★

А ты подумай внимательно - а что такое это EOF

anonymous
()

вот патч чтобы все работало

+#define EOF 0
while (!EOF)
{
-read(file, &s, sizeof(s));
+if (read(file, &s, sizeof(s)) != sizeof(s))
+	break;
cout << s;
}

:)))

lg ★★
()
Ответ на: комментарий от Xela

#include <fcntl.h> //Необходимо для работы системной функции открытия файлов
#include <unistd.h> //Необходимо для работы системной функции чтения файлов
#include <iostream.h> //необходим для cout

#include "BMP.h"

int main (int argc, char* argv[])
{
tagBITMAPFILEHEADER fh;
tagBITMAPINFOHEADER ih;
tagRGBQUAD p;

int from = open (argv[1],O_RDONLY);
int to = open (argv[2],O_RDWR | O_CREAT);

read (from, &fh, sizeof(tagBITMAPFILEHEADER));
read (from, &ih, sizeof(tagBITMAPINFOHEADER));

write (to, &fh, sizeof(tagBITMAPFILEHEADER));
write (to, &ih, sizeof(tagBITMAPINFOHEADER));

while (!EOF)
{
read (from, &p, 4);
write (to, &p, 4);
}

return 0;
}

вот почему я спрашиваю, сдесь всё работает!!!

А в моём случае не работает!!! Почему?!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

А что "все"? Если EOF определен как -1, то цикл while никогда не выполняется и программа сразу выходит на return.
Если все-таки тебе интересно отлавливать конец файла, то
int bytes_read = 0;
do{
bytes_read = read(from,&p,4);
write(to,&p,4);
}while(bytes_read > 0);

EOF здесь совсем никчему. Он используется при работе с функциями потоков (FILE*) а у тебя - низкоуровневый ввод-вывод через дескрипторы.
Вообще info glibc, man read, man write - там все написано.

Flogger_d
()
Ответ на: комментарий от anonymous

#pragma pack(push,1) //для чтения необходимо выравнивение, с сохранением его текущегозначения

typedef unsigned long DWORD; // Двойное слово - 32 бита (разряда)
typedef unsigned short WORD; // Слово - 16 бит (разрядов)
typedef signed long LONG;
typedef unsigned int UINT;

// Заголовок файла
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 'BM' = 4D42h
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits; // Смещение к растру
};

// Заголовок Bitmap
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
};

//структура пиксела
typedef struct tagRGBQUAD
{
char r;
char g;
char b;
char a;
};

#pragma pack(pop) //восстановление значения выравнивания

Ну ладно пусть, Спасибо!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Как я понимаю, это хедер BMP.h - по всему видно, что для виндовса писано. Наверное и пример твой тоже от туда. Я в виндовсе не большой спец и не знаю, что EOF там означает (макрос?), но в Линуксе это просто константа, равная -1. Чтобы определить конец файла нужно смотреть на возвращаемое значение функции read. Смотри пост от lg и читай man:

cyclon@cyclop> man 2 read

Успехов!

anonymous
()
Ответ на: комментарий от anonymous

EOF это EndOfFile во всех блин стандартах касающихся СИ. И от ОСи никак не зависит.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.