Консультация № 174137
11.11.2009, 17:17
0.00 руб.
0 6 1
здравствуйте помогите пожалуйста написать прогу.
Переписать программу WordCounter так, чтобы входной поток данных поступал из
файла, имя которого вводится с командной строки в виде аргумента программы
( wc a.txt ).

Обсуждение

давно
Посетитель
7438
7205
11.11.2009, 17:30
общий
И где же программа WordCounter, которую требуется переписать?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
11.11.2009, 17:35
общий
А где исходники брать?
Неизвестный
11.11.2009, 17:51
общий
Мммм.... А разве она изначально не так работает?
Код:
WC(1)                            User Commands                           WC(1)

NAME
wc - print newline, word, and byte counts for each file

SYNOPSIS
wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F

DESCRIPTION
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. With no FILE, or when FILE is -, read
standard input.

-c, --bytes
print the byte counts

-m, --chars
print the character counts

-l, --lines
print the newline counts

--files0-from=F
read input from the files specified by NUL-terminated names in
file F

-L, --max-line-length
print the length of the longest line

-w, --words
print the word counts

--help display this help and exit

--version
output version information and exit
давно
Старший Модератор
17042
808
12.11.2009, 11:23
общий
Лысков Игорь Витальевич:
По всей видимости, имеется в виду Linux утилита wc, которая подсчитывает число символов, слов и строк в файле.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
12.11.2009, 11:24
общий
Breakheart:
На GNU.org. Вот здесь: Source of wc command.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Старший Модератор
17042
808
12.11.2009, 11:35
общий
это ответ
Здравствуйте, vfores!
В значительной мере переработал исходный текст утилиты wc (Word Count):
1) Убрал все сообщения об ошибках;
2) Убрал подсчёт символов и строк в файле;
3) В качестве аргумента программа теперь принимает одно (и только одно) имя файла;
4) Три функции, ответственные в оригинальной версии программы Word Count за подсчёт слов в файле, объединил в одну - int iProcessFile(char* psFileName);
5) Поскольку текст утилиты несколько запутан в связи со спецификой работы, для подсчёта слов в файле использовал код, предложенный ранее Лысковым Игорем Витальевичем.
Программа, как и оригинальный вариант, написана на Си, комментированный код см. в приложении.
Пример работы программы представлен в прикреплённом скриншоте.


Приложение:
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
//---------------------------------------------------------------------------------------------
int iWordsCount = 0;
//---------------------------------------------------------------------------------------------
int iProcessFile(char* psFileName)
{
char cCharacter; // Текущий символ.

// Флаги состояния разделителей слов - пробелов.
int iSpacePrevious;
int iSpaceCurrent = 1; // Предположим, что текущий символ - пробел

// Открываем файл.
FILE* pFile = fopen(psFileName, "r");
// Если не смогли открыть файл - выходим.
if(!pFile)
{
printf("Невозможно открыть файл '%s'\n", psFileName);
return 1;
}
// Если файл пуст, выходим.
else if(feof(pFile)) return 0;
else
{
// Считываем символы из файла.
// Достигнув конца файла - выходим.
while((cCharacter = getc(pFile)) != EOF)
{
// Запоминаем текущий флаг как предыдущий
iSpacePrevious = iSpaceCurrent;
// Проверяем, является ли текущий символ пробелом
iSpaceCurrent = isspace(cCharacter);
// Если предыдущий символ - пробел (флаг равен 1), а текущий - нет,
// т.е. начало нового слова, то увеличиваем счётчик слов.
iWordsCount += iSpacePrevious && !iSpaceCurrent;
}
}
// Закрываем файл.
fclose(pFile);

return 0;
}
//---------------------------------------------------------------------------------------------
int main(int iArgc, char* psArgv[])
{
if(iArgc < 2) printf("Использование программы: wc [FILE]\n");
else if(iArgc > 2) printf("Слишком много аргументов!\n");
else
{
if(iProcessFile(psArgv[1]) == 0)
{
printf("Файл '%s' содержит %i слов.\n", psArgv[1], iWordsCount);
}
}
return 0;
}
Прикрепленные файлы:
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа