为什么文件名不像文件数组的数据那样递增?
Why doen't the name of the file increment like the data of the file's array does?
所以我知道的标题对内容有点误导,但我的问题是:使用此处提供的代码,当我 运行 ./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;
}
get_filename_from_args
并不像您想象的那样。完全摆脱它,只需在调用站点再次使用 argv[i]
。
这一行:
'wcount(src, dest, get_filename_from_args(argc, argv));'
未单步执行 argv
.
中包含的参数
建议:
'wcount(src, dest, argv[i]);'
并删除函数:
'char* get_filename_from_args(int argc, char* argv[])'
关于这个子问题:
Secondly, how would I tally all of the wcount results so that I have:
7 2 32 total
添加三个全局整型变量
然后当每个值可用时,将其添加到适当的全局变量中。
然后,最后,printf那些全局变量的内容
所以我知道的标题对内容有点误导,但我的问题是:使用此处提供的代码,当我 运行 ./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;
}
get_filename_from_args
并不像您想象的那样。完全摆脱它,只需在调用站点再次使用 argv[i]
。
这一行:
'wcount(src, dest, get_filename_from_args(argc, argv));'
未单步执行 argv
.
建议:
'wcount(src, dest, argv[i]);'
并删除函数:
'char* get_filename_from_args(int argc, char* argv[])'
关于这个子问题:
Secondly, how would I tally all of the wcount results so that I have: 7 2 32 total
添加三个全局整型变量
然后当每个值可用时,将其添加到适当的全局变量中。 然后,最后,printf那些全局变量的内容