2015-11-21 10 views
0

мне нужно реализовать функцию CЧтение строки с чтения) системного вызова (в C

ssize_t readString(int filedes, char* buf, ssize_t max); 

, которая считывает строку из файла, ассоциированного с дескриптором файла «filedes» , в буфер «BUF» и возвращает количество прочитанных байтов. Переменная 'max' не требуется.

Другими словами, я хочу использовать

readString(fileDescriptor, buf); 

таким же образом я хотел бы использовать

fscanf(inputFile, "%s", buf); 

Ниже я имею в виду то, что я сделал до сих пор, но это не очень хорошо работает на всех раз. Есть ли у вас предложения по моему коду? Можете ли вы предложить лучшую реализацию этой функции?

Благодаря

ssize_t readString(int filedes, char* buf){ 
    char *temp; 
    int n = sizeof(buf)/sizeof(char); int i; 
    ssize_t rbytes = 0; /* bytes read */ 
    size_t cbyte = sizeof(char); 

    /* check if file is empty */ 
    if (read(filedes, temp, cbyte) < 1) 
     return 0; 

    /* eat spaces */ 
    while ((*temp == ' ') || (*temp == '\n') || (*temp == '\t')) 
     if (read(filedes, temp, cbyte) < 1) 
      return 0; 

    /* read string */ 
    for (i=0; i<n-1; i++){ 
     buf[i] = *temp; 
     rbytes++; 

     /* check if file is over */ 
     if (read(filedes, temp, cbyte) < 1) 
      return rbytes; 
     /* check if string is over */ 
     if ((*temp == ' ') || (*temp == '\n') || (*temp == '\t')) 
      break; 
    } 

    buf[++i] = '\0'; 
    return rbytes; 
} 
+1

«Это не работает хорошо» не очень хорошее описание проблемы. –

+0

Да, укажите пример ввода, для которого ваша программа не работает, опишите, что такое ожидаемое поведение (что вы сделали) и каково фактическое поведение. – kaylum

ответ

1
ssize_t readString(int filedes, char* buf){ 
    char *temp; 
    int n = sizeof(buf)/sizeof(char); int i; 

Я думаю, вы поняли, что sizeof делает. Он определяет размер вещи, которую вы просите, чтобы выяснить размер. В этом случае это buf, что является char *. Поэтому вы в основном спрашиваете, сколько байтов указатель на символ принимает. Предположительно, вы хотите размер буфера. Таким образом, ваша функция нуждается в дополнительном параметре.

+0

Хм ... Да, но это ---> char mess [] = "hello"; printf ("sizeof (mess) =% d \ n", sizeof (mess)); <--- prints "sizeof (mess) = 6" –

+2

@DaMike Правильно, потому что там 'mess' - массив. В вашем коде 'buf' является указателем на символ, который указывает на первый символ в большом буфере, но' sizeof' не заботится о том, на что указывает указатель, который не меняет размер * указатель*. Конечно, 'sizeof (* buf)' тоже не будет работать, потому что buf указывает на * символ *, так что он вернется 1. Ваш код нуждается в размере буфера, и вы не можете получить это из указатель на его первый символ. –

+0

Хм я провела пару тестов, и вы правы в примере с «беспорядком». И я думал, что хорошо знаю, как работают указатели: D. Спасибо, что помогли мне разобраться в этом. Я буду следовать вашим советам относительно «readString». К сожалению, я не могу описать вам случаи, когда это не работает, но вы уже мне очень помогли. Благодаря :) –

 Смежные вопросы

  • Нет связанных вопросов^_^