чтение в файле и получение длины строки - PullRequest
1 голос
/ 31 июля 2010

gcc 4.4.4 c89

Я использую следующий код для чтения в файле с помощью fgets. Я просто хочу получить пол, который может быть либо М, либо Ф.

Однако, поскольку пол всегда является последним символом в строке. Я думал, что смогу получить характер, используя strlen. Однако по какой-то причине я должен получить strlen и минус 2. Я знаю, что strlen не включает nul. Тем не менее, он будет включать возврат каретки.

Точная строка текста, в котором я читаю, такова:

"Low, Lisa" 35 F

Мой код:

int read_char(FILE *fp)
{
#define STRING_SIZE 30
    char temp[STRING_SIZE] = {0};
    int len = 0;

    fgets(temp, STRING_SIZE, fp);

    if(temp == NULL) {
        fprintf(stderr, "Text file corrupted\n");
        return FALSE;
    }

    len = strlen(temp);
    return temp[len - 2];
}

strlen возвращает 17, когда я чувствую, что должно вернуться 16. Длина строки, включая возврат каретки. Я чувствую, что должен делать - 1 вместо - 2.

Любые предложения, если вы понимаете мой вопрос.

Спасибо

EDIT:

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to  by  s.   Reading  stops
       after  an  EOF  or  a  newline.  If a newline is read, it is stored into the buffer.  A '\0' is stored after the last character in the
       buffer

Таким образом, буфер будет содержать:

"Low, Lisa" 35 F\0\r

Что вернет 17 из strlen, если он включает \ r? Правильно ли я так думаю?

Ответы [ 4 ]

3 голосов
/ 31 июля 2010

Буфер будет содержать:

"Low, Lisa" 35 F\n\0

, поэтому -2 является правильным: strlen - 0 будет нулевым терминатором, -1 - новой строкой, а -2 - буквой F.

Кроме того,

if(temp == NULL) {

temp - это массив - он никогда не может быть NULL.

1 голос
/ 31 июля 2010

Вместо

if (temp == NULL) 

вместо этого проверьте возвращаемое значение из fgets, если его значение равно NULL, то это будет означать сбой

if ( fgets(temp, STRING_SIZE, fp) == NULL )

да, strlen включает новую строку

обратите внимание, что если вы находитесь в последней строке файла и в конце этой строки нет \ n, вы столкнетесь с проблемой, если предположите, что в строке всегда есть \ n.

альтернативаМожно было бы прочитать строку, как вы, но проверить последний символ, если \ n нет, тогда вам не следует использовать смещение -2, а -1.

1 голос
/ 31 июля 2010

Вы отладили и нашли, что именно идет в Лен.Если вы делаете это в c, добавьте часы и узнайте, что отображается на вашем значении len.

1 голос
/ 31 июля 2010

Зависит от операционной системы, используемой для сохранения файлов:

  • для Windows возврат каретки \ r \ n
  • для Linux, они \ n
...