Подсчитать в файле число строк и количество букв “a” - C (СИ)
Формулировка задачи:
Напишите программу, которая запрашивает у пользователя имя текстового файла и подсчитывает в этом файле число строк и количество букв “a”.
Проблема заключается в том, что число строк в файле выдаёт на 1 меньше. Где у меня ошибка в коде, исправьте, пожалуйста?
#include <stdio.h>
#include <conio.h>
int main()
{
char fname[256];
FILE *fp;
int chars, lines;
int chars_t, lines_t;
char c;
printf("\nEnter file name: ");
gets (fname);
fp = fopen(fname, "r");
if (fp == NULL) printf ("\nCancel");
chars_t = 0;
lines_t = 0;
chars=0;
lines=0;
fp=fopen(fname, "r");
while( (c = fgetc(fp)) != EOF)
{
if (c == 'a')
chars++;
if (c =='\n')
lines ++;
}
chars_t += chars;
lines_t += lines;
printf("Total a: %d", chars_t);
printf("\nTotal lines: %d", lines_t);
getch();
}Решение задачи: «Подсчитать в файле число строк и количество букв “a”»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
int main()
{
char fname[256];
FILE *fp;
int chars, lines,i;
int chars_t, lines_t;
char buf[4096];
printf("\nEnter file name: ");
scanf("%s",fname);
fp = fopen(fname, "r");
if (fp == NULL) printf ("\nCancel");
chars_t = 0;
lines_t = 0;
chars=0;
lines=0;
fp=fopen(fname, "r");
while( !feof(fp)){
memset(buf,'\0',4096);
fgets(buf,4096,fp);
for(i=0;i<strlen(buf);i++)if (buf[i] == 'a')chars++;
if(strlen(buf)>0)lines ++;
}
chars_t += chars;
lines_t += lines;
printf("Total a: %d", chars_t);
printf("\nTotal lines: %d", lines_t);
return 0;
}
Объяснение кода листинга программы
- Подключаются необходимые библиотеки для работы с файлами и строками
- Создаются переменные для хранения количества букв
aи строк в файле, а также для хранения количества символов и строк во всем файле - Выводится запрос на ввод имени файла
- Считывается имя файла с помощью функции scanf
- Открывается файл с помощью функции fopen. Если файл не может быть открыт, выводится сообщение об отмене
- Переменные chars_t и lines_t инициализируются нулями
- Переменные chars и lines инициализируются нулями
- Открывается файл с помощью функции fopen
- В цикле while считываются строки из файла с помощью функции fgets
- В каждой строке подсчитывается количество букв
aс помощью цикла for и функции memset для очистки буфера перед каждой итерацией - Если длина строки больше нуля, увеличивается счетчик строк
- После окончания чтения файла, количество букв
aи строк суммируется с общими значениями переменных chars_t и lines_t - Выводятся общие значения переменных chars_t и lines_t
- Функция return завершает работу программы