微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单循环中不可预测的行为,以检查文件中是否存在行和列

如何解决简单循环中不可预测的行为,以检查文件中是否存在行和列

下面是函数代码,该函数检查为其指定的行和列“坐标”对于将指针传递给它的文件是否有效。

混乱的12小时后,我不知道为什么这样随机

在自己的源文件上运行此命令时,它将在任何大于10的列值处引发错误。我假设某些过度积极的编译器优化将q计数变量和chk变量并置,并且由于'\n'具有十进制值10,所以打破了我的循环。

作为假设,我尝试使用GCC进行编译(以前我使用的是Apple Clang)。同样的问题。

在每个文件上,它以大于某个 random col值的任何值失败。在一个文件中,该文件12,在另一个文件中,该文件15。.为什么?

void check_valid(FILE *ffind,long long line,long long col){

    long long unsigned i,q; int f=0; i=0;int chk;q=0; // counter,character holder and control variables
    if(line>=1 && col>=1){ // -ve lines/columns invalid
        while(i<line){
            // tests if line is valid for file
            chk = fgetc(ffind);
            if(chk==EOF){
                f=-1;printf("\nInvalid Line.\n");break; // line invalid if EOF encountered before reaching line count
            }
            else if(chk=='\n')
                i++;    
        }
        if(f==0){
            //if line was valid,checks if the col value is valid.
            rewind(ffind); 
            while(i<line-1){chk=fgetc(ffind);if(chk=='\n')i++;} // brings fptr @ last char of prev. line,so the next char read is 1st char of given line.
            while(q<col){
                chk=fgetc(ffind);
                if(chk==EOF||chk=='\n'){ // if EOF or newline found before reaching col,col is invalid.
                    f=-1;printf("\nInvalid column = %d\n",chk);break;
                }
                else
                    q++;
            }
            if(f==0) printf("\nValid !\n");
        }
}

解决方法

发布的代码有两个问题。

  • if(f==0){ /* line was valid */ }不会在以下i = 0循环之前重置while(i<line-1)。因为i == line-1在上一个循环之后,所以第二个while被完全跳过,并且读取从文件的开头开始,而不是从行line开始。

  • 直到if(chk=='\n')计算为true,一行才被视为完整。如果文件末尾没有以\n换行符终止,则跳过该行的最后一行。在最简单的情况下,只有一个(非空)行但没有\n终止符的文件将始终无法通过check_valid测试。

虽然每个都可以轻松修复,但更直接的方法是通过一次检查。

while(i < line){
    chk = fgetc(ffind);
    if(chk == EOF){
        printf("\nInvalid %s.\n",(i == line - 1) ? "Column" : "Line"); break;
    }
    else if(chk == '\n'){
        if(i == line - 1){
            printf("\nInvalid Column.\n"); break;
        }
        i++; q = 0;
    }
    else if(i == line - 1 && q == col - 1){
        printf("\nValid Line/Column.\n"); break;
    }
    else
        q++;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。