Понимание типа литья в ц - PullRequest
1 голос
/ 11 марта 2010

Я слежу за книгой на c и приду к некоторому коду, который читает файл с 3 строками текста.

#include <stdio.h>

int main (int argc, const char * argv[]) {
    FILE    *fp;
    int c;

    fp = fopen( "../../My Data File", "r" );

    if ( NULL == fp ) {
        printf( "Error opening ../My Data File" );
    } else {
        while ( (c = fgetc( fp )) != EOF )
            putchar ( c );

        fclose( fp );
    }

    return 0;
}

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

int line = 1;

while ( (c = fgetc( fp )) != EOF ){
    if (c == '\n'){
        printf(" LINE %d", line);
        putchar( c );
        line++;
    }
    else {
        putchar ( c );
    }
}

Но не удалось вывести строку #, пока я не изменил тип переменной c на char. Есть ли способ проверить наличие новой строки, все еще используя c как int?

Как правильно проверить перевод строки?

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Ваш код печатает номера строк в конце строки, прямо перед печатью '\n', из-за того, как вы написали цикл. В противном случае ваш код должен работать.

Если вы хотите, чтобы ваш код печатал номера строк в начале, вы можете сделать что-то вроде (не проверено):

int line_num_printed = 0; /* indicating if we printed a line number */
int line = 1;

while ((c = fgetc(fp)) != EOF) {
    if (!line_num_printed) {
        printf("LINE %d: ", line);
        line_num_printed = 1;
    }
    putchar(c);
    if (c == '\n'){
        line++;
        line_num_printed = 0;
    }
}

Если есть что-то, что «не работает», вы должны опубликовать полный код и сообщить нам, что не работает.

Редактировать : Правильный способ проверки символа для новой строки - проверка на '\n'. Если символ взят из файла, вам также следует убедиться, что вы открываете файл в текстовом режиме, то есть без b во втором аргументе fopen().

Кроме того, вы хотите, чтобы c был типа int, а не char. Это связано с тем, что в C EOF является небольшим отрицательным числом, а если char является беззнаковым, сравнивая его с отрицательным числом, преобразуем значение EOF в положительное значение (скорее всего, равное EOF + UCHAR_MAX + 1). Поэтому вы должны , а не изменить c на char тип. Если вы это сделаете, сравнение c != EOF может быть ложным, даже если fgetc() вернет EOF.

0 голосов
/ 11 марта 2010

Обычно целочисленный код для новой строки ('\ n') равен 13. Так что вы можете это сделать (если (c == 13)), но также обратите внимание, что в файлах Windows используется 2 символа для определения новой строки '\ r 'и' \ n '. Целочисленный символ для '\ r' равен 10. Но в основном да, вы можете оставить 'c' в виде целого числа и просто сравнить с 13.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...