什么是算在ANSI C的文本文件的线条和文字的最快方法? [英] What is the fastest way to count lines and words in a text file in ANSI C?
本文介绍了什么是算在ANSI C的文本文件的线条和文字的最快方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
什么是计算在纯ANSI C在一个文本文件的线条和文字的最快方法?
What is the fastest way to count lines and words in a text file in pure ANSI C?
一个字由空格或点终止。线是由终止的'\\ n'
。
A word is terminated by a space or period. Line is terminated by '\n'
.
<一个href=\"http://stackoverflow.com/questions/843154/fastest-way-to-find-the-number-of-lines-in-a-text-c\">This似乎是在C ++。
推荐答案
也许看一看GNU的厕所实用程序,该实用程序不正是你想要的。<源$ C $ C / p>
Maybe take a look at the source code of the GNU wc utility as this utility does exactly what you want.
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
typedef unsigned long count_t; /* Counter type */
/* Current file counters: chars, words, lines */
count_t ccount;
count_t wcount;
count_t lcount;
/* Totals counters: chars, words, lines */
count_t total_ccount = 0;
count_t total_wcount = 0;
count_t total_lcount = 0;
/* Print error message and exit with error status. If PERR is not 0,
display current errno status. */
static void
error_print (int perr, char *fmt, va_list ap)
{
vfprintf (stderr, fmt, ap);
if (perr)
perror (" ");
else
fprintf (stderr, "\n");
exit (1);
}
/* Print error message and exit with error status. */
static void
errf (char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
error_print (0, fmt, ap);
va_end (ap);
}
/* Print error message followed by errno status and exit
with error code. */
static void
perrf (char *fmt, ...)
{
va_list ap;
va_start (ap, fmt);
error_print (1, fmt, ap);
va_end (ap);
}
/* Output counters for given file */
void
report (char *file, count_t ccount, count_t wcount, count_t lcount)
{
printf ("%6lu %6lu %6lu %s\n", lcount, wcount, ccount, file);
}
/* Return true if C is a valid word constituent */
static int
isword (unsigned char c)
{
return isalpha (c);
}
/* Increase character and, if necessary, line counters */
#define COUNT(c) \
ccount++; \
if ((c) == '\n') \
lcount++;
/* Get next word from the input stream. Return 0 on end
of file or error condition. Return 1 otherwise. */
int
getword (FILE *fp)
{
int c;
int word = 0;
if (feof (fp))
return 0;
while ((c = getc (fp)) != EOF)
{
if (isword (c))
{
wcount++;
break;
}
COUNT (c);
}
for (; c != EOF; c = getc (fp))
{
COUNT (c);
if (!isword (c))
break;
}
return c != EOF;
}
/* Process file FILE. */
void
counter (char *file)
{
FILE *fp = fopen (file, "r");
if (!fp)
perrf ("cannot open file `%s'", file);
ccount = wcount = lcount = 0;
while (getword (fp))
;
fclose (fp);
report (file, ccount, wcount, lcount);
total_ccount += ccount;
total_wcount += wcount;
total_lcount += lcount;
}
int
main (int argc, char **argv)
{
int i;
if (argc < 2)
errf ("usage: wc FILE [FILE...]");
for (i = 1; i < argc; i++)
counter (argv[i]);
if (argc > 2)
report ("total", total_ccount, total_wcount, total_lcount);
return 0;
}
在发现:
http://www.gnu.org/software /cflow/manual/html_node/Source-of-wc-command.html
这篇关于什么是算在ANSI C的文本文件的线条和文字的最快方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文