2012-04-22 5 views
1

мне нужно подсчитать количество строк в файле, однако, я должен сделать это без «легких» функций, таких как: fopen, fscanf, fgets ... и так далее ,Чтение количество строк в файле

Значение Я не могу это сделать:

int calculateLines(char *filename) 
{ 
    FILE *myFile; 
    char c; 
    int myLines = 0; 

    myFile = fopen(filename, "r"); 

    if(myFile == NULL) 
     return 0; 

    while ((c = fgetc(f)) != EOF) 
     if(c == '\n') 
      myLines++; 

    fclose(f); 

    if(c != '\n') 
     myLines++; 

    return myLines; 
} 

Для этого, я могу использовать только системные вызовы read, write, close, open & fork.

Из того, что я сделал до сих пор, я думаю, что:

  • открыть файл с open: someResult = wrapper_open(argv[1],O_RDONLY,0);
  • чтения строки после строки с read: Могу ли я как-то манипулировать чтения читать строку после строки ? Я попытался проверить его учебник, но пришел с пустыми руками.
+0

Я не предполагаю, что вам будет разрешено использовать 'system (" wc -l file ");' :-) –

+0

@AdamLiss: Желаю :) – ron

ответ

2

Вы не можете читать строки за строкой с помощью read. Вместо этого вы читаете в блоке данных (которые могут содержать произвольное количество строк и, возможно, некоторые частичные линии). Подсчитайте символы новой строки в этом блоке, затем повторите процесс чтения/подсчета, пока вы не дойдете до конца файла.

+0

Но размер кусков данных, которые я читал каждая итерация, как я могу решить, сколько? просто запишите число и продолжайте? – ron

+0

@ron: Да, в значительной степени. Как правило, вам нужно что-то достаточно большое, чтобы не вызывать 'read' огромное количество раз - в какой-то степени, чем больше это, тем лучше. В то же время огромные огромные (скажем, гигабайты) будут использовать много памяти, не выполняя много. Я бы выбрал где-то между 32K и 1 Meg в качестве отправной точки и, возможно, немного экспериментировал - но точный размер, вероятно, не будет иметь большого значения. –

+0

@ron, каждый блок может быть как маленький символ (например, 'read (fd, & c, 1)'). Вы можете повторить это, пока 'read' возвращает' 1' как число прочитанных символов и проверяет 'c' для нового символа строки. Как только вы получите что-то такое, как это может работать, вы можете начать работу над оптимизациями, такими как увеличение размера буфера и т. Д. –

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