чтение int из файла с помощью read () - PullRequest
0 голосов
/ 13 июля 2011

Я работаю над заданием по программированию на C, где нам разрешено использовать только команды ввода-вывода файла более низкого уровня (поэтому нет вызовов функций fprintf() или fscanf()) для чтения и записи файла.

В одном разделе кода я записываю строку в файл длиной 128 символов, а рядом с ним пишу целое число. Я могу использовать строку символов от pread до read, но я получаю ошибку "неверный адрес", когда снова использую pread для чтения целого числа:

if(pread(heap, structure->str, STRING_MAX_LEN, 0) < 0)
{
    return -1;
}
else
{
    printf("read str\n");
}

if(pread(file, structure->size, 1, STRING_MAX_LEN + 1) < 0)
{
    return 0;
}
else
{
    printf("read size\n"); 
}

Кто-нибудь знает, что я делаю не так?

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Вы передаете 1 как размер целого числа. Если это не символ, вы делаете это неправильно.

Что такое structure->size? Какой тип?

РЕДАКТИРОВАТЬ

Поскольку вы на самом деле пишете int, вы должны использовать sizeof(int) или sizeof(structure->size).

Вы также должны передать адрес переменной, а не ее значение, используя оператор &, поэтому ваша строка будет выглядеть так:

if (pread(file, &structure->size, sizeof(structure->size), STRING_MAX_LEN + 1) < 0) { 
    return 0; 
} 
else { 
    printf("read size\n"); 
}
1 голос
/ 13 июля 2011

Попробуйте использовать sizeof вместо жесткого кодирования размера.Пусть компилятор работает для вас.

Во-вторых, второй аргумент pread выглядит как указатель на буфер, который вы намереваетесь заполнить.Вы передаете само поле int (по значению) - обычно компилятор C более чем рад рассматривать int как указатель.Вам нужно передать поле int по ссылке , чтобы у pread был указатель на int, который он должен заполнить октетами.Вы получаете нарушение доступа к памяти (неверный адрес), потому что значение поля int, которое вы передаете по значению, рассматривается как адресная точка в ячейке памяти, вам не разрешается прикасаться.

Первый pread() работает, потому что (я подозреваю), что structure->str является либо char*, либо массивом символов, которые будут обрабатываться как указатель.

if ( pread(heap,structure->str,STRING_MAX_LEN,0) < 0 )
{
  return -1;
}
else
{
  printf("read str\n");
}

if ( pread(file,&(structure->size), sizeof(structure->size) , STRING_MAX_LEN + 1 ) < 0 )
{
  return 0 ;
}
else
{
  printf("read size\n");
}
1 голос
/ 13 июля 2011

Является ли structure->size int*?Если это просто int, то вам нужно передать его адрес с &.

Edit : и, как говорят другие, «1» почти наверняка не числобайтов в вашем int, хотя это может быть - вы, вероятно, должны использовать sizeof()

...