计算文件中的字符我找不到问题

标签 c

为什么这个函数不计算文本中的字符?我在包含 countchars 的主函数中打开文件。文件也是从 countchars 之前的函数打开的,但我在 countchars 结束时关闭它。为什么 fscanf没有 !=EOF 只读取最后一个字母词?

void countchars(FILE *p){
        char ch;
        int countc=0;
        for(;(fscanf(p,"%c",&ch)!=EOF);countc++);
        printf("%d",countc);

其余代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getchoice(void);
void inserttextfromfile();
void printtextdata(FILE *);
void countwords(FILE *);
void calculatetextstatistics();
void countchars(FILE *);
int main(){ 
    int a;
    while((a=getchoice())){
      switch (a){
            case 1:
                  break;
            case 2:    ;
                  break;
            case 3:    ;
                  break;
            case 4:    ;
                  break;
            case 5:calculatetextstatistics() ;
                  break;
            case 6:    ;
                  break;
            default: break;
        }
    }


    return 0;
}
int getchoice(){
    int a;
    scanf("%d",&a);
    return a;
}

void calculatetextstatistics(){
    FILE *p;
    p=fopen("mytext.txt","rt");
    countwords(p);
    countchars(p);
    fclose(p);
}
void countwords(FILE *p){
    int countw=0;
    char wordholder[10]=" ";
    char wordlist[60][10];
    for (;(fscanf(p,"%s",wordholder))!= EOF;countw++);
    printf("%d\n",countw);
    return;
}
void countchars(FILE *p){
    char ch;

    int countc=0;
    for(;(fscanf(p,"%c",&ch)!=EOF);countw++);
    printf("%d",countw);

}

最佳答案

您读取文件内容的方法效率很低,但应该可行,除非流指针 p 具有无效值,例如 NULL

用于此目的的经典代码是这样的:

#include <stdio.h>

void countchars(FILE *fp) {
    int ch;
    int countc = 0;
    while ((c = getc(fp)) != EOF)
        countc++;
    printf("%d\n", countc);
}

您的函数失败,因为流已被读取到文件末尾。您可以使用 rewind(fp);fseek(fp, 0L, SEEK_SET); 将文件流重置为文件开头,但并非所有流都可以通过这种方式倒带.例如无法重新启动从控制台读取。

您的单词计数功能已损坏:如果文件中的任何单词超过 9 个字节,则您有未定义的行为。您应该一次读取一个字符并计算从空格字符到非空格字符的转换次数:

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

void countwords(FILE *fp) {
    int countw = 0;
    int c, lastc = '\n';

    while ((c = getc(fp)) != EOF) {
        countw += isspace(lastc) && !isspace(c);
        lastc = c;
    }
    printf("%d\n", countw);
}

如果您坚持使用fscanf(),这里有一个替代方案:

void countwords(FILE *fp) {
    int countw = 0;
    char c, lastc = '\n';

    while (fscanf(fp, "%c", &c) == 1) {
        countw += isspace((unsigned char)lastc) && !isspace((unsigned char)c);
        lastc = c;
    }
    printf("%d\n", countw);
}

关于计算文件中的字符我找不到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50066269/

相关文章:

C程序三维表的第一个值

c - 无法编译 super 简单的代码

c++ - 数字系统转换器不适用于特定编译器 (Dev-C++)

c - 当 BFS 搜索元素等于给定输入时,如何在 C 中停止生长树

c - C 中的悬空指针

c - 这个函数是如何工作的 "abcdefghijklmnopqrstuvwxyz"[rand()%26]?

c - 将输入加载到 C 中的 vector 类型函数时遇到问题

c - 如何使用内部 C API 读取 Ruby 全局变量?

c++ - 在 iOS 上使用 C++ 代码,创建静态库或与 Objective C 混合使用?

c - skb校验和计算功能可能导致系统挂起