2017-04-26 23 views
0

我正在尝试,但无法弄清楚程序中的最后一个do-while循环是如何工作的。 它应该从最后到第一个位置打印文件的字符,并在文件跨越文件边界时终止。 我显示的代码正在工作,但我没有得到如何。 虽然条件是我似乎无法理解,为什么不符号!用于while中的条件。无法理解end while循环到底是如何工作的

#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'); 
} 

此代码工作正常,只是不明白为什么不“!”因为我想使用相同的条件,但没有使用部分。

+0

“此代码正常工作”和“while(feof(fp)== 0){... c = getc(fp); printf(“... is%c \ n”,c);'怀疑打印出一个字符值为'(unsigned char)EOF' – chux

回答

2

fseek返回0成功,失败时返回非零值。

返回值

If successful, the function returns zero. 
Otherwise, it returns non-zero value. 

所以当它是成功的,它将返回0,你想,当它继续下去。因此,not

1

C没有用于布尔值的独立类型族。它使用整数 - 0意味着false,而其他任何意思是true。在C99中引入的_Bool类型是一个可以表示这些值的整数类型,并且可以自由使用其他整数类型来表示布尔值。逻辑运算符!只是交换这些; !x相当于(x == 0) ? 1 : 0,这本身就相当于(x == 0)

像许多C函数fseek()的返回值表示其成功或失败。负值代表失败,非负值则成功;细节有所不同,fseek()特别使用0成功,-1失败。

有关while环路的谓词...

while(!fseek(fp, -2L, 1)) 

...因此可以被解释为“调用fseek(fp, -2L, 1)和如果成功执行另一迭代,通过返回0所指示的”。该调用尝试向后移动通过刚刚读取(和打印)的字符,并且向前经过另一个字符,如果成功,则读取的下一个字符将是紧接在文件中读取的前一个字符之前的那个字符。

+1

“C没有单独的布尔数据类型。不同意自C99以来,有'_Bool'规范调用_boolean type_,一个对象足够大,以存储值0和1. – chux

+0

好吧,@chux,我希望我的修订语言现在令人满意的精确。 –

+0

布尔,'_Bool'问题是切线的,它不会在这里发挥作用。 'while(表达式)'简单地比较_expression_和0 – chux