为什么文件增量的名称与文件数组的数据一样?

时间:2015-02-03 02:38:53

标签: c arrays file-io

所以我知道的标题对内容有点误导,但我的问题是:使用此处提供的代码,当我运行./tstats input1.txt input2.txt时输出如下

5 1 21 input1.txt
2 1 11 input1.txt

所以显而易见的是,每个文件的信息都经过,但文件的名称却没有。知道为什么会这样吗?我正在看一些小错误? 其次,我将如何统计所有wcount结果,以便我拥有:     总计7 2 32

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


enum state
{
    START,
    WORD,
    DELIM,
};

FILE*
input_from_args(int argc, char *argv[])
{
    if (argc == 1)
    {
        return stdin;
    }
    else
    {
        return fopen(argv[1], "r");
    } 

}
char* get_filename_from_args(int argc, char* argv[])
{
    int i;

    static char stdin_name[] = "-";
    if (argc == 1) 
    {
        return stdin_name;
    }
    else
    {

        for (i = 1; i < argc; i++)
        {   
            return argv[i];
        }
    return argv[i]; 
    }
}
void
wcount(FILE *src, FILE *dest, char* src_filename)
{
    int ch, wc, lc, cc;
    enum state cstate;

    wc = lc = cc = 0;
    cstate = START;
    while ((ch = fgetc(src)) != EOF){
        cc++;
        switch (cstate) {
            case START:
                if (isspace(ch)) {
                    cstate = DELIM;
                    if (ch == '\n') {
                        lc++;
                    }
                }
                else {
                    cstate = WORD;
                    wc++;
                }
                break;
            case DELIM:
                if (ch == '\n') {
                    lc++;
                }
                else if (!isspace(ch)) {
                    cstate = WORD;
                    wc++;
                }
                break;
            case WORD:
                if (isspace(ch)) {
                    cstate = DELIM;
                    if (ch == '\n') {
                        lc++;
                    }
                }
                break;
        }
    }

    fprintf(dest, "%4d\t%4d\t%4d\t%10s\n", wc, lc, cc, src_filename);
}
int
main(int argc, char* argv[])
{
    int i;  
    FILE *src = input_from_args(argc, argv);
    FILE *dest = stdout;


    for (i = 1; i < argc; i++)
    {
        if ((src = fopen(argv[i], "r")) == NULL)
        {
            fprintf(stderr, "%s: unable to open %s\n", argv[0], argv[i]);   
        }

        wcount(src, dest, get_filename_from_args(argc, argv));
        fclose(src);
    }
    return EXIT_SUCCESS;
}   

3 个答案:

答案 0 :(得分:1)

get_filename_from_args没有按照您的想法行事。完全摆脱它,只需在呼叫站点再次使用argv[i]

答案 1 :(得分:0)

这一行:

'wcount(src, dest, get_filename_from_args(argc, argv));'

没有单步执行argv中包含的参数。

推荐:

'wcount(src, dest, argv[i]);'

并取消功能:

'char* get_filename_from_args(int argc, char* argv[])'

答案 2 :(得分:0)

关于这个子问题:

  

其次,我如何计算所有wcount结果,以便我有:   总计7 2 32

添加三个全局int变量

然后,当每个值都可用时,将其添加到适当的全局变量中。 然后,最后,printf那些全局变量的内容