Программа на C для определения количества строк в текстовом файле

Эта программа на C отображает количество строк в текстовом файле.

Вот исходный код программы на языке C для определения количества строк в текстовом файле. Программа на C успешно скомпилирована и запускается в системе Linux. Вывод программы также показан ниже.

  1. /* 
  2.  * Программа на C для определения количества строк в текстовом файле 
  3.  */
  4.  #include  
  5.  
  6.  int main () 
  7.  {
  8.  FILE * fileptr; 
  9.  int count_lines = 0; 
  10.  char filechar [40], chr; 
  11.  
  12.  printf ("Введите имя файла:"); 
  13.  scanf ("% s", filechar); 
  14.  fileptr = fopen (filechar, "r"); 
  15. //извлекаем символ из  файл и сохранить в chr 
  16.  chr = getc (fileptr); 
  17.  while (  chr! = EOF) 
  18.  {
  19. //Считать каждый раз, когда встречается новая строка  
  20.  if (chr == 'n') 
  21.  {
  22.  count_lines = count_lines + 1; 
  23. } 
  24. //взять следующий символ  из файла. 
  25.  chr = getc (fileptr); 
  26. } 
  27.  fclose (fileptr); //закрываем файл. 
  28.  printf ("% d строк в% s в файле  n", count_lines, filechar); 
  29.  return 0; 
  30. } 

реклама
 $ cc pgm49.c $ a.out Введите имя файла: pgm2.c В файле pgm2.c 43 строки 

Серия Sanfoundry Global Education & Learning Series — 1000 программ на языке C.

реклама

Вот список лучших справочников по программированию, структурам данных и алгоритмам на C

Если хотите Чтобы посмотреть другие примеры программ по обработке файлов, перейдите в раздел Обработка файлов. Если вы хотите ознакомиться с примерами программирования по всем темам, перейдите к разделу «Примеры программирования на языке C».

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

Telegram | Youtube | LinkedIn | Instagram | Facebook | Twitter | Pinterest
Youtube | LinkedIn | Instagram | Facebook | Twitter | Pinterest
«Назад — Программа на C, которая альтернативно объединяет строки из 2 файлов и результат печати
» Далее — Программа на C для отображения собственного исходного кода в качестве вывода


Функция C, которая подсчитывает строки в файле

Когда я пытаюсь запустить свою программу, я получаю неправильное количество строк.

  LINES: 0  

Это результат, хотя в моем .txt файле есть пять строк

Вот моя программа:

  #include  #include  int countlines (char * filename); void main (int argc,  char * argv []) {printf ("ЛИНИИ:% d  n", countlines (argv [1]));  } int countlines (char * filename) {//подсчитываем количество строк в файле с именем filename FILE * fp = fopen (filename, "r");  int ch = 0;  int lines = 0;  если (fp == NULL);  возврат 0;  строки ++;  while ((ch = fgetc (fp))! = EOF) {if (ch == ' n') lines ++;  } fclose (fp);  return lines;}  

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


  while (! Feof (fp)) {ch = fgetc (fp);  если (ch == ' n') {строки ++;  }}  

Но обратите внимание: почему «while (! feof (file))» всегда неверно?


4

Вы объявляете

  int countlines (char * filename  )  

, чтобы принять аргумент char * .

Вы называете это так

  countlines (fp)  

передача ФАЙЛА *.

Вот почему вы получаете эту ошибку компиляции.

Вероятно, вам следует изменить эту вторую строку на

  countlines ("Test.txt")  

, поскольку вы открываете файл в countlines

Ваш текущий код пытается открыть файл в двух разных местах.

Улучшите этот ответ
ответил 4 окт. 2012 в 18:05
  • Я ошибся, main должен принимать значение аргумента с именем файл. Программа компилируется, но я получаю ошибку с ошибкой сегмента (дамп ядра). — Michael_19, 04 окт., 12:13
  • 2
    Вы должны принять ответ, касающийся вашего исходного вопроса, вместо того, чтобы полностью менять вопрос, и задать новый вопрос. — Эрик Дж.. 04 окт., В 22:38
добавить комментарий |

Вы объявляете

  int countlines (char * filename)  

, чтобы принять аргумент char * .

Вы называете это так

  countlines (fp)  

передача ФАЙЛА *.

Вот почему вы получаете эту ошибку компиляции.

Вероятно, вам следует изменить эту вторую строку на

  countlines ("Test.txt")  

, поскольку вы открываете файл in countlines

Ваш текущий код пытается открыть файл в двух разных местах.


3

У вас есть; в конце if .Change:

  if (fp == NULL);  return 0;  

to

  if (fp == NULL) return 0;  

Улучшить этот ответ
4 октября 2012 г. в 18:53
  • 4
    Это одна из многих причин, почему if без {} — плохая идея. — Lundin 4 окт. 2012 в 19:10
добавить комментарий |

У вас есть; в конце if .Change:

  if (fp == NULL);  return 0;  

to

  if (fp == NULL) return 0;  

3

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

  void main (void) {printf ("LINES:% d  n", countlines ("Test.txt"));}  

EDIT: вы меняете вопрос, поэтому на него очень сложно ответить; сначала вы неправильно изменили main () , вы забыли, что первым параметром является argc, поэтому он разбился. Теперь у вас есть проблема;

  if (fp == NULL); // 

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

Улучшите этот ответ
отредактировано 04 окт., В 19:10
ответил 4 окт. 2012 в 18:06
  • Я изменил код так, чтобы он принимал значение аргумента, которое является именем текста. Я получаю ошибку сегмента ошибки (дамп ядра), когда запускаю программу сейчас. — Michael_19, 04 окт. 2012, в 18:15
  • @ Michael_19 Ну, main на самом деле не принимает аргументы таким образом. Попробуйте int main (int argc, char * argv []) — Иоахим Исакссон, 4 октября 2012 г., 18:30
  • @ Michael_19 Хорошо, последняя попытка ответить, но вы продолжаете изменить свой вопрос, чтобы существующие ответы больше не применялись, а ответы становились все менее и менее полезными для других. Если у вас есть еще вопросы, примите ответ, который поможет вам, и задайте новый вопрос с вашей новой проблемой. — Иоахим Исакссон 04 окт., 2012 в 19:12
добавить комментарий |

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

  void main (void) {printf ("LINES:% d  n", countlines ("Test.txt"));}  

EDIT: вы меняете вопрос, поэтому на него очень сложно ответить; сначала вы неправильно изменили main () , вы забыли, что первым параметром является argc, поэтому он разбился. Теперь у вас есть проблема;

  if (fp == NULL); // 

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


0

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

Доступ к argv [1] , когда он не существует, вызовет ошибку сегментации. Обычно рекомендуется проверять количество аргументов, прежде чем пытаться ссылаться на них. Вы можете сделать это, используя следующий прототип функции для main () и убедившись, что argc больше 1 (просто укажите количество записей в argv).

  int main (int argc, char ** argv)  

Лучший способ выяснить, что вызывает segfault в целом , — это использовать отладчик. Если вы работаете в Visual Studio, установите точку останова в верхней части основной функции, а затем выберите Запуск с отладкой вместо «Запуск без отладки» при запуске программы. Он остановит выполнение наверху и позволит вам шаг за шагом, пока вы не увидите проблему.

Если вы работаете в Linux, вы можете просто взять файл ядра (он будет иметь «core» в имени) и загрузите его с помощью gdb (GNU Debugger). Он может дать вам дамп стека, который укажет вам прямо на строку, которая вызвала ошибку сегментации.

РЕДАКТИРОВАТЬ: Я вижу, вы изменили свой вопрос и код. Так что этот ответ, вероятно, больше не полезен, но я все равно оставлю его как хороший совет и посмотрю, смогу ли я вскоре ответить на измененный вопрос).

Улучшить этот ответ
ответил 04 октября 2012 в 18:46
добавить комментарий |

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

Доступ к argv [1] , когда он не существует, вызовет ошибку сегментации. Обычно рекомендуется проверять количество аргументов перед попыткой ссылаться на них. Вы можете сделать это, используя следующий прототип функции для main () и проверка того, что argc больше 1 (просто он укажет количество записей в argv).

  int main (int argc, char  ** argv)  

Лучший способ выяснить, что вызывает segfault в целом , — это использовать отладчик. Если вы работаете в Visual Studio, установите точку останова в верхней части основной функции, а затем выберите Запуск с отладкой вместо «Запуск без отладки» при запуске программы. Он остановит выполнение в верхней части и позволит вам шаг за шагом, пока вы не увидите проблему.

Если вы работаете в Linux, вы можете просто взять файл ядра (он будет иметь «core» в имени) и загрузите его с помощью gdb (GNU Debugger). Он может предоставить вам дамп стека, который укажет вам прямо на строку, которая вызвала ошибку сегментации.

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


0

Вот моя функция

  char * fileName =  "input-1.txt"; countOfLinesFromFile (fileName); void countOfLinesFromFile (char * filename) {FILE * myfile = fopen (filename, "r"); int ch, number_of_lines = 0; do {ch = fgetc (myfile);  if (ch == ' n') number_of_lines ++;} while (ch! = EOF); ​​if (ch! = ' n' && number_of_lines! = 0) number_of_lines ++; fclose (myfile); printf ("количество строк в  % s =% d ", имя_файла, число_строчных_строчек);  

}

Улучшите этот ответ
ответил 27 ноября ’17 в 17:26
добавить комментарий |

Вот моя функция

  char * fileName = "input-1.txt  "; countOfLinesFromFile (fileName); void countOfLinesFromFile (char * filename) {FILE * myfile = fopen (filename," r "); int ch, number_of_lines = 0; do {ch = fgetc (myfile);  if (ch == ' n') number_of_lines ++;} while (ch! = EOF); ​​if (ch! = ' n' && number_of_lines! = 0) number_of_lines ++; fclose (myfile); printf ("количество строк в  % s =% d ", имя_файла, число_строчных_строчек);  

}


-1

Вот полная реализация на C/C ++

  #include  void  lineCount (int argc, char ** argv) {если (argc  

Улучшите этот ответ
отредактировал 23 марта ’19 в 21:26
ответил 23 марта ’19 в 20:09
  • Вот полная реализация на C/C ++ — KotoJallow 23 марта ’19 в 20:14
добавить комментарий |

Вот полная реализация на C/C ++

  #include  void lineCount (int argc, char ** argv) {if (argc  

Оцените статью
logicle.ru
Добавить комментарий