C:计算文件中 Upper/Lower 个大小写字符的数量
C: Counting the number of Upper/Lower case chars out of a file
好吧,我正在尝试从一个文件中读取一段文本,然后将有多少个大写和小写字符以及多少个数字写入另一个文件。
#include <stdio.h>
int main()
{
int *p;
int caps, low, num, i;
caps = low = num = 0;
FILE *fin, *fout;
fin = fopen("input.txt","r");
fout = fopen("output.txt","w");
if (fin == NULL)
{
printf("FILE ERROR\n");
return 1;
}
else
printf("BABE THIS WORKS\n");
i=0;
while(fscanf(fin, "%s", p) != EOF)
{
if(p[i] >= 'a' && p[i] <= 'z')
low++;
if(p[i] >= 'A' && p[i] <= 'Z')
caps++;
if(p[i] >= '0' && p[i] <= '9')
num++;
}
fprintf(fout,"Lower: %d, Caps: %d, Numbers: %d", low, caps, num);
fclose(fin);
fclose(fout);
system("pause");
return 0;
}
然而,当我 运行 这个时,它只是 "crashes" 而没有在 output.txt 文件中写入任何内容。
我错过了什么?
由于您正在比较 个字符 ,最简单的读取方式是使用 character-oriented 输入。该库提供了几个 character-oriented 输入函数,(例如 getchar()
(从 stdin
读取)或 getc
和 fgetc
从 FILE* stream
读取)。这样可以避免在读取后必须遍历任何数组来检查每个字符。
使用您的方法的一个简短示例如下。唯一的调整是包含一个三元运算符,它可以将 read/writes 添加到作为程序参数给出的文件名中(或者如果没有给出文件名,则使用默认的 stdin
和 stdout
)。它只是防止对文件中的文件名进行硬编码。要在 input.txt
和 output.txt
上使用该程序,只需将程序调用为 ./programname input.txt output.txt
:
#include <stdio.h>
int main (int argc, char **argv)
{
int p, caps, low, num;
p = caps = low = num = 0;
FILE *fin, *fout;
/* read from filename argv[1] (default: stdin),
write to filename argv[2] (default: stdout) */
fin = argc > 1 ? fopen (argv[1], "r") : stdin;
fout = argc > 2 ? fopen (argv[2], "w") : stdout;
if (fin == NULL) {
fprintf (stderr, "input file open failed.\n");
return 1;
}
if (fout == NULL) {
fprintf (stderr, "output file open failed.\n");
return 1;
}
while ((p = fgetc (fin)) != EOF)
{
if ('a' <= p && p <= 'z') low++;
if ('A' <= p && p <= 'Z') caps++;
if ('0' <= p && p <= '9') num++;
}
fprintf (fout, "\n Lower: %d, Caps: %d, Numbers: %d\n\n", low, caps, num);
if (fin != stdin) fclose(fin);
if (fout != stdout) fclose(fout);
//system("pause");
return 0;
}
示例输入文件
$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
输出(reading/writing默认为stdin/stdout)
$ ./bin/countltrs <../dat/captnjack.txt
Lower: 47, Caps: 12, Numbers: 0
如果您还有其他问题,请告诉我。
好吧,我正在尝试从一个文件中读取一段文本,然后将有多少个大写和小写字符以及多少个数字写入另一个文件。
#include <stdio.h>
int main()
{
int *p;
int caps, low, num, i;
caps = low = num = 0;
FILE *fin, *fout;
fin = fopen("input.txt","r");
fout = fopen("output.txt","w");
if (fin == NULL)
{
printf("FILE ERROR\n");
return 1;
}
else
printf("BABE THIS WORKS\n");
i=0;
while(fscanf(fin, "%s", p) != EOF)
{
if(p[i] >= 'a' && p[i] <= 'z')
low++;
if(p[i] >= 'A' && p[i] <= 'Z')
caps++;
if(p[i] >= '0' && p[i] <= '9')
num++;
}
fprintf(fout,"Lower: %d, Caps: %d, Numbers: %d", low, caps, num);
fclose(fin);
fclose(fout);
system("pause");
return 0;
}
然而,当我 运行 这个时,它只是 "crashes" 而没有在 output.txt 文件中写入任何内容。
我错过了什么?
由于您正在比较 个字符 ,最简单的读取方式是使用 character-oriented 输入。该库提供了几个 character-oriented 输入函数,(例如 getchar()
(从 stdin
读取)或 getc
和 fgetc
从 FILE* stream
读取)。这样可以避免在读取后必须遍历任何数组来检查每个字符。
使用您的方法的一个简短示例如下。唯一的调整是包含一个三元运算符,它可以将 read/writes 添加到作为程序参数给出的文件名中(或者如果没有给出文件名,则使用默认的 stdin
和 stdout
)。它只是防止对文件中的文件名进行硬编码。要在 input.txt
和 output.txt
上使用该程序,只需将程序调用为 ./programname input.txt output.txt
:
#include <stdio.h>
int main (int argc, char **argv)
{
int p, caps, low, num;
p = caps = low = num = 0;
FILE *fin, *fout;
/* read from filename argv[1] (default: stdin),
write to filename argv[2] (default: stdout) */
fin = argc > 1 ? fopen (argv[1], "r") : stdin;
fout = argc > 2 ? fopen (argv[2], "w") : stdout;
if (fin == NULL) {
fprintf (stderr, "input file open failed.\n");
return 1;
}
if (fout == NULL) {
fprintf (stderr, "output file open failed.\n");
return 1;
}
while ((p = fgetc (fin)) != EOF)
{
if ('a' <= p && p <= 'z') low++;
if ('A' <= p && p <= 'Z') caps++;
if ('0' <= p && p <= '9') num++;
}
fprintf (fout, "\n Lower: %d, Caps: %d, Numbers: %d\n\n", low, caps, num);
if (fin != stdin) fclose(fin);
if (fout != stdout) fclose(fout);
//system("pause");
return 0;
}
示例输入文件
$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
输出(reading/writing默认为stdin/stdout)
$ ./bin/countltrs <../dat/captnjack.txt
Lower: 47, Caps: 12, Numbers: 0
如果您还有其他问题,请告诉我。