C 如何检查输入文件是否包含字母或特定数字?

C 如何检查输入文件是否包含字母或特定数字?,c,file,validation,C,File,Validation,我一直在尝试验证输入文件。它有两个条件: 它不能包含字母 文件中的数字必须在0到7的范围内-仅限整数 如果这两个条件都得到验证,我想打印出有效,如果没有,则在stderr上打印无效。程序运行不正常-我似乎从未得到有效的输出 FILE *r; r = fopen("soubor.txt", "r"); if (r == NULL) { fprintf(stderr, "File could not be opened\n"); } else {

我一直在尝试验证输入文件。它有两个条件:

  • 它不能包含字母
  • 文件中的数字必须在
    0
    7
    的范围内-仅限整数
  • 如果这两个条件都得到验证,我想打印出
    有效
    ,如果没有,则在
    stderr
    上打印
    无效
    。程序运行不正常-我似乎从未得到有效的输出

        FILE *r;
    
        r = fopen("soubor.txt", "r");
        if (r == NULL) {
            fprintf(stderr, "File could not be opened\n");
        } else {
            int c;
            bool alpha = false;
            bool outOfRange = false;
            while ((c = fgetc(r)) != EOF) {
                if (isalpha(c) != 0) {
                    alpha = true;
                    break;
                }
                if (c < 0 || c > 7) {
                    outOfRange = true;
                    break;
                }
            }
            if (alpha == false && outOfRange == false) {
                printf("Valid\n");
            }
            if (alpha == true || outOfRange == true) {
                fprintf(stderr, "Invalid");
            }
            fclose(r);
        }
    
    文件*r;
    r=fopen(“soubor.txt”,“r”);
    if(r==NULL){
    fprintf(stderr,“无法打开文件”\n);
    }否则{
    INTC;
    布尔阿尔法=假;
    bool outOfRange=false;
    而((c=fgetc(r))!=EOF){
    如果(isalpha(c)!=0){
    α=真;
    打破
    }
    如果(c<0 | | c>7){
    outOfRange=true;
    打破
    }
    }
    if(alpha==false&&outOfRange==false){
    printf(“有效\n”);
    }
    if(alpha==true | | outOfRange==true){
    fprintf(标准“无效”);
    }
    fclose(r);
    }
    
    使用like(省略错误处理):


    您的问题说明不完全清楚:

    • 在文件中写入数字时,数字必须介于0到7之间-仅限整数。您是指数字还是数字,如
      10
      ?那么
      01
    根据注释中的精确性,该文件应仅包含空格和范围
    0
    内的非连续数字。
    7

    以下是具有以下语义的修改版本:

    #include <ctype.h>
    #include <stdbool.h>
    
    int main() {
        FILE *r = fopen("soubor.txt", "r");
        if (r == NULL) {
            fprintf(stderr, "File could not be opened\n");
            return 1;
        }
        bool valid = true;
        bool last_is_digit = false;
        int c;
        while ((c = getc(r)) != EOF) {
            if (isspace(c)) {
                last_is_digit = false;
            } else
            if (!last_is_digit && c >= '0' && c <= '7') {
                last_is_digit = true;
            } else {
                valid = false;
                break;
            }
        }
        if (valid) {
            fprintf(stderr, "Valid\n");
        } else {
            fprintf(stderr, "Invalid\n");
        }
        fclose(r);
        return 0;
    }
    
    #包括
    #包括
    int main(){
    文件*r=fopen(“soubor.txt”,“r”);
    if(r==NULL){
    fprintf(stderr,“无法打开文件”\n);
    返回1;
    }
    bool valid=true;
    bool last_是_digit=false;
    INTC;
    而((c=getc(r))!=EOF){
    if(i空间(c)){
    最后一个字母是字母数字=假;
    }否则
    
    如果(!last_is_digit&&c>='0'&&c将
    01234
    作为有效文件,或者这些数字是否需要分隔(由一个或多个非字母分隔)?例如,
    0,1.2 | 3:4
    ?关于
    00005 006
    isalpha(*input)
    在默认情况下对
    char
    进行签名时,平台上的负字符值具有未定义的行为。您应按以下方式转换
    char
    参数:
    isalpha((未签名字符)*输入)
    @chqrlie这是否只适用于
    ctype.h
    函数?如果
    *input
    为负会发生什么?这确实适用于
    中的所有函数:它们的定义值与
    getc()的返回值相同
    ,类型为
    无符号字符的所有值加上负值
    EOF
    ,通常定义为
    (-1)
    。这些函数通常定义为宏或内联函数,使用参数索引到根据当前区域设置确定的标志数组中。下面的
    EOF
    负索引将指向数组外部,导致未定义的行为。让我指定一点。txt文件必须只包含0到7之间的数字-(0,1,2,3,4,5,6,7)这是一个有效输入文件的示例:67 1 4 2 5 0 6 1 4 4 0 4 0 0 2 1 0 4 0 4 4 6 1 1 2 7 1 0 4 2 3 1 2 3 3 1 5 2 0 4 5 5 4 4 4 4是一个有效的输入文件吗?
    0和
    1是有效的数字,但
    10
    是一个大于
    7
    的数字。数字是如何分开的?是
    e> -
    允许使用字符?唯一有效的取消输出是0,1,2,3,4,5,6或7..No 10或00001等。所有数字基本上都是用空格分隔的2D数组。然后您应该只接受空格以及
    0
    7
    之间的非连续数字和空格。我将更新我的答案。
    FILE *fp = . . . ;
    char *buf = malloc(n);
    
    fread(buf, n, 1, fp);
    
    fprintf(stderr, "%s", isValid(buf) ? "Valid" : "Invalid");
    
    #include <ctype.h>
    #include <stdbool.h>
    
    int main() {
        FILE *r = fopen("soubor.txt", "r");
        if (r == NULL) {
            fprintf(stderr, "File could not be opened\n");
            return 1;
        }
        bool valid = true;
        bool last_is_digit = false;
        int c;
        while ((c = getc(r)) != EOF) {
            if (isspace(c)) {
                last_is_digit = false;
            } else
            if (!last_is_digit && c >= '0' && c <= '7') {
                last_is_digit = true;
            } else {
                valid = false;
                break;
            }
        }
        if (valid) {
            fprintf(stderr, "Valid\n");
        } else {
            fprintf(stderr, "Invalid\n");
        }
        fclose(r);
        return 0;
    }