Can';我不明白最后的do while循环是如何工作的
我正在尝试,但就是不知道程序中最后一个do-while循环是如何工作的。 它应该从文件的末尾到第一个位置打印文件的字符,并在跨越文件边界时终止。 我展示的代码是有效的,但我不知道如何使用。 虽然条件是我似乎无法理解的,为什么不是符号呢!与while中的条件一起使用Can';我不明白最后的do while循环是如何工作的,c,do-while,C,Do While,我正在尝试,但就是不知道程序中最后一个do-while循环是如何工作的。 它应该从文件的末尾到第一个位置打印文件的字符,并在跨越文件边界时终止。 我展示的代码是有效的,但我不知道如何使用。 虽然条件是我似乎无法理解的,为什么不是符号呢!与while中的条件一起使用 #include <stdio.h> int main() { long n, k; char c; FILE *fp; fp = fopen("RANDO
#include <stdio.h>
int main()
{
long n, k;
char c;
FILE *fp;
fp = fopen("RANDOM", "w");
while ((c = getchar()) != EOF) {
putc(c, fp);
}
n = ftell(fp);
printf("\nNo. of characters entered by the user is : %ld\n", n);
fclose(fp);
fp = fopen("RANDOM", "r");
k = 0L;
while (feof(fp) == 0) {
fseek(fp, k, 0);
n = ftell(fp);
c = getc(fp);
printf("The character at %ld position is %c\n", n, c);
k += 5L;
}
fseek(fp, -1L, 2);
do {
printf("%c", getc(fp));
} while(!fseek(fp, -2L, 1));
putchar('\n');
}
#包括
int main()
{
长n,k;
字符c;
文件*fp;
fp=fopen(“随机”、“w”);
而((c=getchar())!=EOF){
putc(c,fp);
}
n=ftell(fp);
printf(“\n用户输入的字符数为:%ld\n”,n);
fclose(fp);
fp=fopen(“随机”、“r”);
k=0L;
while(feof(fp)==0){
fseek(fp,k,0);
n=ftell(fp);
c=getc(fp);
printf(“位于%ld位置的字符是%c\n”,n,c);
k+=5L;
}
fseek(fp,-1L,2);
做{
printf(“%c”,getc(fp));
}而(!fseek(fp,-2L,1));
putchar('\n');
}
这段代码工作得很好,只是不理解为什么,没有使用上一个while中的条件“!”,因为我想使用相同的条件,但没有not部分 C没有单独的布尔值类型族。它使用整数--0表示
false
,其他任何值表示true
。C99中引入的\u Bool
类型是可以表示这些值的整数类型,其他整数类型可以自由地用于表示布尔值。逻辑运算符代码>仅交换这些<代码>!x
是否等于(x==0)?1:0
,它本身只相当于(x==0)
与许多C函数一样,fseek()
的返回值指示其成功或失败。通常,负值代表失败,非负值代表成功;详细信息略有不同,fseek()
专门使用0
表示成功,-1
表示失败
有问题的while
循环的谓词
while(!fseek(fp, -2L, 1))
。。。因此可以解释为“调用
fseek(fp,-2L,1)
,如果成功,则执行另一个迭代,如返回0所示”。调用尝试向后移动,越过刚刚读取(和打印)的字符,向前移动超过另一个字符,如果成功,则下一个读取的字符将是文件中前一个读取字符的前一个字符。C没有单独的布尔值类型族。它使用整数--0表示false
,其他任何值表示true
。C99中引入的\u Bool
类型是可以表示这些值的整数类型,其他整数类型可以自由地用于表示布尔值。逻辑运算符代码>仅交换这些<代码>!x
是否等于(x==0)?1:0
,它本身只相当于(x==0)
与许多C函数一样,fseek()
的返回值指示其成功或失败。通常,负值代表失败,非负值代表成功;详细信息略有不同,fseek()
专门使用0
表示成功,-1
表示失败
有问题的while
循环的谓词
while(!fseek(fp, -2L, 1))
。。。因此可以解释为“调用fseek(fp,-2L,1)
,如果成功,则执行另一个迭代,如返回0所示”。调用尝试向后移动,越过刚刚读取(和打印)的字符,向前移动超过另一个字符,如果成功,则下一个字符读取将是文件中前一个字符读取的前一个字符。成功时返回0
,不成功时返回非零值
返回值
因此,当它成功时,它将返回0
,当它成功时,您希望继续。因此,not
在成功时返回0
,在不成功时返回非零值
返回值
因此,当它成功时,它将返回
0
,当它成功时,您希望继续。因此,not
“此代码工作正常”和while(feof(fp)=0{…c=getc(fp);printf(“…是%c\n”,c);
是可疑的,因为它打印的字符值为(unsigned char)EOF
“此代码工作正常”和while(feof(fp)==0){…c=getc(fp);printf(“…是%c\n”,c);
是可疑的,因为打印值为(无符号字符)EOF
“c没有单独的布尔数据类型。“不同意C99之后,有一个\u Bool
,规范称之为布尔类型,一个足够大的对象来存储值0和1。好了,@chux,我希望我的修订语言现在是令人满意的精确。布尔,\u Bool
问题是相切的,它在这里不起作用。while(表达式)
simple将表达式与0进行比较。所讨论的表达式涉及逻辑求反运算符@chux,它至少受到布尔逻辑的启发。此外,将该运算符应用于fseek()的返回值的原因和/或意义
,一个int
,是OP的一个明确的混淆点。这就是布尔值问题的重要性所在(我同意,这不是特别重要的问题,但你提到了)。“C没有单独的布尔值数据类型。”不同意C99之后,有一个\u Bool
,规范称之为布尔类型,一个足够大的对象来存储值0和1。好了,@chux,我希望我的修订语言现在是令人满意的精确。布尔类型