Страница 1 из 1
Open & Read
Добавлено: 04 авг 2005, 11:57
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);
Что делать?
Добавлено: 04 авг 2005, 12:23
exe
А где проверки на ошибки? Где вывод errno?
Добавлено: 04 авг 2005, 14:07
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;
}
Даже новыю строку в конце не пропустил
.
Я смотрел исходники cat, там для работы в бинарном режиме использовали O_BINARY с open. Так как я начал писать на С совсем недавно, я ничего не понял и не нашел где лежит эта константа.
Добавлено: 04 авг 2005, 14:12
exe
Так что тебе perror выдает?
Добавлено: 04 авг 2005, 14:17
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
Добавлено: 04 авг 2005, 18:50
exe
Попробуй
printf("nread=%d\n", (int)nread);
for (int i=0; i < nread; i ++)
{
printf("%x", (int)buf);
}
printf("\n");
А ещё лучше пройди в debuggere и не мучайся.
похоже всё читает, но вывод binary data как строку - это плохо.
Добавлено: 04 авг 2005, 22:32
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 - индиетичны.
Спасибо за хелп.
Добавлено: 04 авг 2005, 22:32
Silos
Может книжки какие есть?