Консультация № 177776
09.04.2010, 20:19
38.66 руб.
0 5 2
Доброго времени суток, уважаемые эксперты!
Требуется Ваша помощь в написании программы (для Windows,cреда - Borland C++ Builder 6.0)
Задача. Написать программу, которая подсчитывает и количество пустых строк в текстовом файле. Путь к файлу указывается пользователем.
Заранее спасибо.

Обсуждение

Неизвестный
09.04.2010, 21:17
общий
это ответ
Здравствуйте, Botsman.
Согласно тому, что вы написали, имеется две части задания, т.к. после глагола "подсчитывает" идёт союз "и". К сожалению, я не смог догадаться, какое второе условие необходимо выполнить, однако позволил себе предположить, что количество всех строк. В связи с этим сделал вывод вида: "%количество пустых строк% / %количество строк%.
Если необходимо было что-то другое, вы можете сообщить мне, и я исправлю код программы.
Пользуйтесь.
P.S. писалось на Embarcadero C++ Builder 2010

Приложение:
// ---------------------------------------------------------------------------

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
// ---------------------------------------------------------------------------
#define DEBUG_MODE 0

int main() {
FILE *file = NULL;
char path[1024];
#if DEBUG_MODE == 1
cout << "Input file path: ";
do {

do {
try {
cin >> path;
}
catch(...) {
cout << "Incorrect path. Try again.\n";
}
}
while (!strlen(path));

file = fopen(path, "r");
if (!file) {
cout << "File doesn't exist. Try again.\n";
getch();
clrscr();
}
}
while (file == NULL);
#else
file = fopen("test.txt", "r");
#endif
strcpy(path, "");
// начинаем использовать переменную path как временную
int len = 0, number = 0; // len = количество пустых строк, number = количество всех строк
while (!feof(file)) {

fgets(path, 1024, file);
if (!strcmp(path, "\n")) {
len++;
}
else {
if (!strlen(path))
len++;

}
strcpy(path, "");
number++;
}

printf("\n\n Empty string: %d / %d", len, number);

getch();
return 0;
}
// ---------------------------------------------------------------------------
5
Неизвестный
12.04.2010, 09:48
общий
Гардукевич Роман Эдуардович:
Спасибо за ответ.
После союза "и" пропущено "выводит на экран" ;)), так что с этим все нормально, а общее количество строк можно не выводить.
Смущает (немного) другое. В задании указано "путь к файлу указывается пользователем". Когда же я запускаю программу, никакой путь ввести не предлагается. При попытке выставить #define DEBUG_MODE 1 компилятор выдает ошибку "Expression syntax" и останавливается в строке,выделенной жирным:
...
#if DEBUG_MODE == 1
cout << "Input file path: ";
do {

do {
try {
cin >> path;
}
...
Тестировал в старом добром BC++ 3.1
давно
Академик
320937
2216
12.04.2010, 13:51
общий
Botsman:
Вы указали в вопросе BCBuilder 6.0, в мини-форуме BC++3.1. Таки где надо делать? Нужно ли оконное приложение или консоль?
Неизвестный
12.04.2010, 14:06
общий
это ответ
Здравствуйте, Botsman.
Вот мой вариант. Чистый c. Имя файла берет 1 аргументом, считает правильно независимо от варианта конца строки (DOS/unix/MAC).
Считать или нет последний перевод строки настраивается.

Приложение:
#include <stdio.h>
#include <stdlib.h>

/* считать ли последний перевод строки отдельной строкой */
#define COUNT_LAST_LINE


int main(int argc,char ** argv)
{
if(argc!=2)
{
fprintf(stderr,"Usage:\n%s filename\n",argv[0]);
return 1;
};
FILE * fd=fopen(argv[1],"r");
if(fd==NULL)
{
fprintf(stderr,"Usage:\n%s filename\n",argv[0]);
return 1;
};
char end=0,prev=0,current=0;
unsigned count=0;
while(fread(¤t,1,1,fd)==1)
{
if(end==0)
{
if(current==13 || current==10)
{
end=current;
prev=current;
};
}else{
if(current==13 || current==10)
{
if(current==end && prev==end)++count;
if(current==end)prev=current;
}else{
prev=current;
};
};
};
#ifdef COUNT_LAST_LINE
if(end==prev)++count;
#endif

printf("%u\n",count);
fclose(fd);

return 0;
};
5
Неизвестный
12.04.2010, 20:23
общий
Botsman:
Собственно всю часть с define можно убирать. Мне просто удобно программировать, когда можно выбирать: вводить данные, или сделать их готовыми.
В чём ошибка - не имею представления. Блок try ...catch() можно убрать, он создан всего лишь для отлова возможной ошибки.
DEBUG_MODE стоит держать равным 0. Забыл просто убрать.
Форма ответа