如何解决简单循环中不可预测的行为,以检查文件中是否存在行和列
下面是函数的代码,该函数检查为其指定的行和列“坐标”对于将指针传递给它的文件是否有效。
混乱的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 举报,一经查实,本站将立刻删除。