File I/O C语言的字数统计程序
File I/O word count program in C
我知道已经有几个关于这个主题的问题,但似乎这些问题要么没有得到完全回答,要么很难应用到我的代码中,所以如果这是重复的,我深表歉意。
我在整个 I/O 程序中遇到了以下功能的问题,该程序还进行字数和行数计数(那些工作)。 char* 文件名是从命令行中提取的。在这个例子中,它是从一个带有 lorum ipsum 的 txt 文件中提取的。 (69 个字)理论上,下面的函数应该从文件名中读取并将其写入数组。然后读取该数组并检查当前字符是否为 space ' ' 而下一个字符不是。目前 returns 0 无论如何。
int wordcount(char* filename) {
int wc=0,i=0,z=0;
char w, test[1000];
FILE *fp;
fp = fopen(filename, "r");
while (feof(fp) == 0) {
fscanf(fp, "%c", &test[i]);
i++;
}
while (z>i-1) {
if (test[z] = ' ' && test[z+1] != ' ' ) {
wc++;z++;
}
}
return wc;
}
注意:我知道声明一个 1000 字符数组的效率非常低,但我不确定该怎么做。如果您有任何改进或其他方法来实现这一点,如果您分享,我们将不胜感激。另外,我知道这目前忽略了其他类型的白色space,但我只是先测试一下,之后会扩展。
感谢您的帮助。
为什么总是得到0字的具体问题:
while (z>i-1) {
z
永远不会大于 i-1
。可能您打算在 z
小于 i-1
时循环:
while (z<i-1) {
此外,当您找到一个单词时,您只会递增 z
。你应该为你测试的每个字符增加它,不管它是否是 space。
有一个示例函数可以满足您的需要。对您的代码的一些建议,当您不再需要该文件时,fopen() 必须跟在 fclose() 之后。始终检查由 fopen 编辑的指针 return 是否不为 NULL,在这种情况下什么也不做,只是 return 错误代码。可以通过 space 字符后跟非 space 字符安全地检测新词的存在,在这种情况下递增世界计数 ++wc。使用 getc() 从文件对象中读取一个字符,并使用 isspace() 函数检查该字符是否为 space 字符。如果在 worldcount 运行.
期间没有人修改该文件,则不需要数组来存储该文件
int wordcount(const char* filename)
{
int wc=0;
char c;
FILE *fp;
fp = fopen(filename, "r");
if(fp == NULL)
{
return -1;
}
bool previsspace = 1;
while ((c=getc(fp)) != EOF)
{
if (isspace(c)==0 && (previsspace==1)) ++wc;
previsspace = isspace(c);
}
fclose(fp);
return wc;
};
您将需要以下包含文件:
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
我知道已经有几个关于这个主题的问题,但似乎这些问题要么没有得到完全回答,要么很难应用到我的代码中,所以如果这是重复的,我深表歉意。 我在整个 I/O 程序中遇到了以下功能的问题,该程序还进行字数和行数计数(那些工作)。 char* 文件名是从命令行中提取的。在这个例子中,它是从一个带有 lorum ipsum 的 txt 文件中提取的。 (69 个字)理论上,下面的函数应该从文件名中读取并将其写入数组。然后读取该数组并检查当前字符是否为 space ' ' 而下一个字符不是。目前 returns 0 无论如何。
int wordcount(char* filename) {
int wc=0,i=0,z=0;
char w, test[1000];
FILE *fp;
fp = fopen(filename, "r");
while (feof(fp) == 0) {
fscanf(fp, "%c", &test[i]);
i++;
}
while (z>i-1) {
if (test[z] = ' ' && test[z+1] != ' ' ) {
wc++;z++;
}
}
return wc;
}
注意:我知道声明一个 1000 字符数组的效率非常低,但我不确定该怎么做。如果您有任何改进或其他方法来实现这一点,如果您分享,我们将不胜感激。另外,我知道这目前忽略了其他类型的白色space,但我只是先测试一下,之后会扩展。
感谢您的帮助。
为什么总是得到0字的具体问题:
while (z>i-1) {
z
永远不会大于 i-1
。可能您打算在 z
小于 i-1
时循环:
while (z<i-1) {
此外,当您找到一个单词时,您只会递增 z
。你应该为你测试的每个字符增加它,不管它是否是 space。
有一个示例函数可以满足您的需要。对您的代码的一些建议,当您不再需要该文件时,fopen() 必须跟在 fclose() 之后。始终检查由 fopen 编辑的指针 return 是否不为 NULL,在这种情况下什么也不做,只是 return 错误代码。可以通过 space 字符后跟非 space 字符安全地检测新词的存在,在这种情况下递增世界计数 ++wc。使用 getc() 从文件对象中读取一个字符,并使用 isspace() 函数检查该字符是否为 space 字符。如果在 worldcount 运行.
期间没有人修改该文件,则不需要数组来存储该文件int wordcount(const char* filename)
{
int wc=0;
char c;
FILE *fp;
fp = fopen(filename, "r");
if(fp == NULL)
{
return -1;
}
bool previsspace = 1;
while ((c=getc(fp)) != EOF)
{
if (isspace(c)==0 && (previsspace==1)) ++wc;
previsspace = isspace(c);
}
fclose(fp);
return wc;
};
您将需要以下包含文件:
#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>