Нахождение размера строки каждой строки в текстовом файле - PullRequest
5 голосов
/ 26 января 2010

Как вы можете посчитать количество символов или цифр в каждой строке? Есть ли что-то вроде EOF, больше похожее на конец строки?

Ответы [ 5 ]

5 голосов
/ 26 января 2010

Вы можете перебирать каждый символ в строке и увеличивать счетчик до тех пор, пока не встретится конец строки ('\n'). Убедитесь, что файл открыт в текстовом режиме ("r"), а не в двоичном режиме ("rb"). В противном случае поток не будет автоматически преобразовывать конечные последовательности строк разных платформ в '\n' символы.

Вот пример:

int charcount( FILE *const fin )
{
    int c, count;

    count = 0;
    for( ;; )
    {
        c = fgetc( fin );
        if( c == EOF || c == '\n' )
            break;
        ++count;
    }

    return count;
}

Вот пример программы для проверки вышеуказанной функции:

#include <stdio.h>

int main( int argc, char **argv )
{
    FILE *fin;

    fin = fopen( "test.txt", "r" );
    if( fin == NULL )
        return 1;

    printf( "Character count: %d.\n", charcount( fin ) );

    fclose( fin );
    return 0;
}
2 голосов
/ 26 января 2010

Что касается чтения файла построчно, посмотрите на fgets .

char *fgets(char *restrict s, int n, FILE *restrict stream);

Функция fgets () читает байты из потока в массив указал на по s, пока не будет прочитано n-1 байт или читается и передается s, или условие конца файла встречается. Строка тогда завершается нулевым байтом.

Единственная проблема здесь может быть, если вы не можете гарантировать максимальный размер строки в вашем файле. Если это так, вы можете перебирать символы, пока не увидите перевод строки.

Относительно конца строки:

Краткий ответ: \n - символ новой строки (также называемый переводом строки).

Длинный ответ из Википедии:

Системы на основе ASCII или совместимых набор символов использовать либо LF (Line подача, 0x0A, 10 в десятичном виде) или CR (Возврат каретки, 0x0D, 13 в десятичном виде) индивидуально или CR, затем LF (CR + LF, 0x0D 0x0A); см. ниже для историческая причина для CR + LF условность. Эти персонажи основаны по командам принтера: перевод строки указано, что одна строка бумаги следует выдавать из принтера, а возврат каретки указал, что каретка принтера должна вернуться к начало текущей строки.

* LF:    Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others
* CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS
* CR:    Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9

Но поскольку вы вряд ли будете работать с представлением, которое использует только возврат каретки, поиск строки должен быть в порядке.

1 голос
/ 26 января 2010

Если вы откроете файл в текстовом режиме, то есть без b во втором аргументе fopen(), вы можете читать символы по одному, пока не нажмете '\n', чтобы определить размер строки. Базовая система должна позаботиться о переводе конца строки в один символ, '\n'. В некоторых системах последняя строка текстового файла может не заканчиваться '\n', так что это особый случай.

псевдокод:

count := 0
c := next()
while c != EOF and c != '\n'"
    count := count + 1

выше будет подсчитано количество символов в данной строке. next() - это функция для возврата следующего символа из вашего файла.

В качестве альтернативы вы можете использовать fgets() с буфером:

char buf[SIZE];
count = 0;
while (fgets(buf, sizeof buf, fp) != NULL) {
    /* see if the string represented by buf has a '\n' in it,
       if yes, add the index of that '\n' to count, and that's
       the number of characters on that line, which you can
       return to the caller.  If not, add sizeof buf - 1 to count */
}
/* If count is non-zero here, the last line ended without a newline */
1 голос
/ 26 января 2010

\n - символ новой строки в C. В других языках, таких как C #, вы можете использовать что-то вроде Environment.EndLine в C # для преодоления трудностей с платформой.

Если вы уже знаете, что ваша строка состоит из одной строки (назовем ее строкой), используйте strlen(line), чтобы получить количество символов в ней. Вычтите 1, если оно заканчивается на '\n'.

Если в строке есть символы новой строки, вам нужно разделить ее на символы новой строки, а затем вызвать strlen() для каждой подстроки.

0 голосов
/ 27 марта 2019

Первоначальный вопрос заключался в том, как получить количество символов в «каждой строке» (с учетом строки? Или текущей строки?), В то время как ответы в основном дали решения, как определить длину первой строки в файле , Можно легко применить некоторые из них, чтобы определить длину текущей строки (без угадывания заранее максимальной длины буфера).

Однако на практике часто требуется максимальная длина любой строки в файле. Затем можно зарезервировать буфер и использовать fgets для чтения файла построчно, а также использовать некоторые полезные функции (strtok, strtod и т. Д.) Для разбора строк. На практике вы можете использовать любое из предыдущих решений, чтобы определить длину одной строки, и просто просмотреть все строки и взять максимум.

Простой скрипт, который читает файл символ за символом:

    max=0; i=0;
    do 
        if ((c=fgetc(f))!= EOF && c!='\n') i++; 
        else { 
            if (i>max) max=i;
            i=0;
            }
    while (c!=EOF);
    return max;

Примечание. На практике было бы достаточно иметь верхнюю границу для максимальной длины. Грязное решение было бы использовать размер файла в качестве верхней границы для максимальной длины строк.

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