如何计算文件中的字符数?

时间:2018-02-23 06:46:18

标签: c

我已将文件内容复制到另一个文件中,我试图获取行,字和字符数。我现在拥有的代码显示了文件内容中的行数和单词数。现在我需要显示字符数,但我不确定如何做到这一点。我猜一个for循环?但我不确定。

{{1}}

2 个答案:

答案 0 :(得分:1)

您无需编写不同的函数来计算文件中的行数,字数和字符数。您可以通过逐个字符解析文件来进行解析,并且在解析时,为了将文件内容复制到另一个文件,您可以将字符写入另一个文件。你可以这样做:

#include <stdio.h>
#include <stdlib.h>

int count_and_copy(const char * ipsumFile, const char * ipsumCopy)
{
    unsigned int cCount = 0, wCount = 0, lCount = 0;
    int incr_word_count = 0, c;
    FILE *fp, *fp2;

    if ((fp = fopen(ipsumFile, "r")) == NULL)
    {
        fprintf(stdout, "Can't open %s file.\n", ipsumFile);
        exit(EXIT_FAILURE);
    }

    if ((fp2 = fopen(ipsumCopy, "w+")) == NULL)
    {
        fprintf(stdout, "Can't open %s file.\n", ipsumCopy);
        exit(EXIT_FAILURE);
    }

    while((c = fgetc(fp)) != EOF)
    {
            fputc(c, fp2); // write character c to the copy file
            cCount++; // character count
            if(c == '\n') lCount++; // line count
            if (c == ' ' || c == '\n' || c == '\t')
                    incr_word_count = 0;
            else if (incr_word_count == 0) {
                    incr_word_count = 1;
                     wCount++; // word count
            }
    }
    fclose (fp);
    fclose (fp2);
    printf ("Number of lines : %u\n", lCount);
    printf ("Number of words : %u\n", wCount);
    printf ("Number of characters : %u\n", cCount);
    return 0;
}
int main()
{
    /* Assuming, you want to count number of lines, words
     * and characters of file1 and copy the contents of file1
     * to file2.
     */
    count_and_copy("file1", "file2");
    return 0;
}

答案 1 :(得分:0)

我认为以下方法可行:

void *cw(const char *fname)
{
    FILE *f = fopen(fname, "r");
    if (f == NULL) {
        fprintf(stderr, "fopen(%s): %s\n", fname, strerror(errno));
        exit(EXIT_FAILURE);
    }

    int bc = 0; /* bytes counter */
    int wc = 0 ; /* words counter */
    int nlc = 0; /* new lines counter */

    const int in_word_state = 0;
    const int out_word_state = 1;

    int state = out_word_state;

    int c = 0;
    for (;;) {
        c = fgetc(f);

        if (ferror(f) != 0) {
            perror("fgetc");
            goto error;
        }

        if (feof(f))
            break;

        if (c == '\n')
            nlc++;
        if (c == ' ' || c == '\t' || c == '\n')
            state = out_word_state;
        if (state == out_word_state) {
            state = in_word_state;
            wc++;
        }
        bc++;
    }

    if (fclose(f) == EOF) {
        perror("fclose");
        goto error;
    }

    printf("w: %d, c: %d, l:%d\n", wc, bc, nlc);

 error:
    if (f != NULL) {
        if (fclose(f) == EOF) {
            perror("fclose");
        }
    }
    exit(EXIT_FAILURE);
}