Статьи Галерея Форум Чат Файлы HowTo Ссылки Поиск
Текущее время: 23 сен 2019, 13:29




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Open & Read
СообщениеДобавлено: 04 авг 2005, 11:57 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 15.02.2004
Сообщения: 287
Откуда: Belarus, Minsk
Мне надо прочитать бинарник, но этот код его не читает, хотя должен:
(Любой другой читает и в buf ложит)
Код:
int fd;
ssize_t nread;
char buf[10240];

fd = open("bindata", O_RDONLY);
nread = read(fd, buf, 10240);
printf("%s    %d", buf, nread);



Что делать?


Вернуться к началу
 Не в сети Профиль Личный альбом  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005, 12:23 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 28.11.2003
Сообщения: 861
Откуда: Минск
А где проверки на ошибки? Где вывод errno?


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005, 14:07 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 15.02.2004
Сообщения: 287
Откуда: Belarus, Minsk
Ок, так устраивает?

Код:
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <error.h>


int main()
{
        int fd;
        ssize_t nread;
        char buf[1024];

        if( (fd = open("bindata", O_RDONLY)) == -1)
        {
                perror("ОШИБКА открытия файла");
                exit(1);
        }

        if( (nread = read(fd, buf, 1024)) == -1)
        {
                perror("ОШИБКА чтения из файла");
                exit(1);
        }

        printf("%s\n\n%d   %d\n", buf, strlen(buf), nread);
        close(fd);

        return 0;
}



Даже новыю строку в конце не пропустил :shock:.

Я смотрел исходники cat, там для работы в бинарном режиме использовали O_BINARY с open. Так как я начал писать на С совсем недавно, я ничего не понял и не нашел где лежит эта константа. :oops: :oops: :oops:


Вернуться к началу
 Не в сети Профиль Личный альбом  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005, 14:12 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 28.11.2003
Сообщения: 861
Откуда: Минск
Так что тебе perror выдает?


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005, 14:17 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 15.02.2004
Сообщения: 287
Откуда: Belarus, Minsk
Ничего.

Код:
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <error.h>


int main()
{
        int fd;
        ssize_t nread;
        char buf[1024];

        if( (fd = open("bindata", O_RDONLY)) == -1)
        {
                perror("ОШИБКА открытия файла");
                exit(1);
        }
        perror("debug");
        if( (nread = read(fd, buf, 1024)) == -1)
        {
                perror("ОШИБКА чтения из файла");
                exit(1);
        }
        perror("debug");
        printf("%s   %d     %d\n", buf, strlen(buf), nread);
        perror("debug");
        close(fd);
        perror("debug");
        return 0;
}


А вот это пишет это:

debug: Success
debug: Illegal seek
0 78
debug: Illegal seek
debug: Illegal seek


Вернуться к началу
 Не в сети Профиль Личный альбом  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005, 18:50 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 28.11.2003
Сообщения: 861
Откуда: Минск
Попробуй

printf("nread=%d\n", (int)nread);

for (int i=0; i < nread; i ++)
{
printf("%x", (int)buf[i]);
}

printf("\n");

А ещё лучше пройди в debuggere и не мучайся.

похоже всё читает, но вывод binary data как строку - это плохо.


Вернуться к началу
 Не в сети Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005, 22:32 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 15.02.2004
Сообщения: 287
Откуда: Belarus, Minsk
Опссс....
Раздул топик, да не так мысль свою вырази.

Код:

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <error.h>


int main()
{
        int fd;
        ssize_t nread, w;
        char buf[1024];

        if( (fd = open("bindata", O_RDONLY)) == -1)
        {
                perror("ОШИБКА открытия файла");
                exit(1);
        }

        if( (nread = read(fd, buf, 1024)) == -1)
        {
                perror("ОШИБКА чтения из файла");
                exit(1);
        }

        close(fd);

        if( (fd = open("newfile", O_WRONLY|O_CREAT, 0644)) == -1)
        {
                perror("ОШИБКА открытия файла");
                exit(1);
        }

        if( (w = write(fd, buf, nread)) == -1)
        {
                perror("ОШИБКА записи в файл");
                exit(1);
        }

        close(fd);
        return 0;
}


Я просто думал, что printf в любом случае должна выводить buf. Но как оказалось не в любом. Мне надо было проверить, заполняется ли buf, хотел таким образом посмореть.

После сравнил newfile и bindata - индиетичны.

Спасибо за хелп.


Вернуться к началу
 Не в сети Профиль Личный альбом  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005, 22:32 
Неотъемлемая часть форума
Аватара пользователя

У нас с: 15.02.2004
Сообщения: 287
Откуда: Belarus, Minsk
Может книжки какие есть?


Вернуться к началу
 Не в сети Профиль Личный альбом  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
[ All resources are available under GNU GPL ] [ Support ] [ Hosted by DataHata | MyCloud.by ] [ Powered by phpBB® Forum Software © phpBB Group ]

LVEE Winter LVEE Rambler's Top100