我想用C编写一个程序,该程序将接受输入的.txt文件,从中读取文件并应用函数或在stdout上显示文本或将其写入out文件。为了简单起见,我将其编写为仅显示单词。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
int main(int argc, char **argv){
int c;
int output = 0;
FILE *infile;
while((c = getopt(argc, argv, "o:")) != -1){
switch(c){
case 'o':
if(output){
exit(EXIT_FAILURE);
}
output = 1;
break;
case '?':
exit(EXIT_FAILURE);
default:
exit(EXIT_FAILURE);
}
}
for(; optind< argc; optind++) {
infile = fopen(argv[optind], "r");
size_t cpos = 0;
char str[100];
int ch;
while((ch = fgetc(infile)) != EOF ) {
if(ch == '\n' || ch == ' '){
fprintf(stderr, "%s\n", str);
str[0] = '\0';
continue;
} else{
str[cpos++] = ch;
}
}
str[cpos] = 0;
fprintf(stderr, "%s\n", str);
fclose(infile);
}
exit(EXIT_SUCCESS);
}
我的问题是while语句的一部分:
for(; optind< argc; optind++) {
infile = fopen(argv[optind], "r");
size_t cpos = 0;
char str[100];
int ch;
while((ch = fgetc(infile)) != EOF ) {
if(ch == '\n' || ch == ' '){
fprintf(stderr, "%s\n", str);
str[0] = '\0';
continue;
} else{
str[cpos++] = ch;
}
}
str[cpos] = 0;
fprintf(stderr, "%s\n", str);
fclose(infile);
}
在infile = fopen(argv[optind], "r")
中,我正在保存argv
中的文件名。在while
语句中,我从infile
到fgetc
到EOF
读一个字符。我想阅读每个字符,直到碰到空白行或空格。当我按下'\n'
或' '
时,我想在stderr
上显示该字符串,将String重置为空,并继续在下一行读取字符。否则ch
将被放置在str[cpos]
上(每个循环cpos
递增)。在str[cpos]
的末尾设置为0
以标记字符串的结尾,最后的str
被打印并关闭文件内。
问题:
如果我输入.txt文件(./program -o out.txt input.txt
)
word1
word2
word3
我所能得到的是
word1
我尝试将str[0]= '\0'
设置为空字符串,但是之后str
上没有存储任何内容。如何输出所有3个单词?
答案 0 :(得分:2)
我看到了几个潜在的问题:
cpos
重置为零。\n
或
,则将在末尾输出空白行。答案 1 :(得分:1)
您尚未对所构建的字符串进行零终止,也没有为下一个单词重置cpos = 0;
。
结果是,您将继续向str[]
写入数据,而不是终止于此的'\0'
。
循环应如下所示:
while((ch = fgetc(infile)) != EOF ) {
if(ch == '\n' || ch == ' '){
str[cpos] = '\0'; // terminate this string
fprintf(stderr, "%s\n", str);
cpos = 0; // for next word
} else{
str[cpos++] = ch;
}
}
答案 2 :(得分:1)
当您知道str数组包含单词中的所有字符时,必须在数组后面附加一个终止符(零字节),并将cpos重置为0,然后再收集新单词的chars。
因此,假设str是{'w','o','r','d'} 而cpos是4 你做str [cpos] = 0 然后str是{'w','o','r','d',0} 那是一个正确的以零结尾的字符串
空字符串为{0},没错
无论如何不要忘记将cpos重置为0,否则您将在终止符之后进行写操作。