Open & Read

Все о программировании под *nix
Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Open & Read

Сообщение Silos »

Мне надо прочитать бинарник, но этот код его не читает, хотя должен:
(Любой другой читает и в buf ложит)

Код: Выделить всё

int fd;
ssize_t nread;
char buf[10240];

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

Что делать?

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

А где проверки на ошибки? Где вывод errno?

Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Сообщение Silos »

Ок, так устраивает?

Код: Выделить всё

#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:

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Так что тебе perror выдает?

Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Сообщение Silos »

Ничего.

Код: Выделить всё

#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

Аватара пользователя
exe
Неотъемлемая часть форума
Сообщения: 860
Зарегистрирован: 28 ноя 2003, 21:08
Откуда: Минск

Сообщение exe »

Попробуй

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

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

printf("\n");

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

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

Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Сообщение Silos »

Опссс....
Раздул топик, да не так мысль свою вырази.

Код: Выделить всё


#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 - индиетичны.

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

Аватара пользователя
Silos
Неотъемлемая часть форума
Сообщения: 287
Зарегистрирован: 15 фев 2004, 19:04
Откуда: Belarus, Minsk
Контактная информация:

Сообщение Silos »

Может книжки какие есть?

Ответить