Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ftell()函数是如何工作的?_C_File_While Loop - Fatal编程技术网

C ftell()函数是如何工作的?

C ftell()函数是如何工作的?,c,file,while-loop,C,File,While Loop,我有这个代码,但我不明白它是如何工作的: void print(char * fileName) { FILE * fp; int ch; fp = fopen(fileName, "r"); while (ftell(fp) < 20) { ch = fgetc(fp); putchar(ch); } fclose(fp); } void打印(字符*文件名) { 文件*fp; int-ch; fp=

我有这个代码,但我不明白它是如何工作的:

void print(char * fileName)
{
    FILE * fp;
    int ch;
    fp = fopen(fileName, "r");
    while (ftell(fp) < 20)
    {
        ch = fgetc(fp);
        putchar(ch);
    }
    fclose(fp);
}
void打印(字符*文件名)
{
文件*fp;
int-ch;
fp=fopen(文件名,“r”);
而(ftell(fp)<20)
{
ch=fgetc(fp);
putchar(ch);
}
fclose(fp);
}
那么,如果ftell(fp)处于循环中,它是如何工作的呢? 因为在循环中没有任何东西可以让它上升。 它是如何进行的?

ftell()
获取流的位置指示器的当前值(在您的情况下,它基本上返回当前指向的字符位置)

fgetc()
从指定流中获取下一个字符(无符号字符),并前进流的位置指示器。此函数用于在文件或错误结束时将读取为无符号字符转换的字符返回到int或EOF

程序流程 简单来说,这意味着-

  • fgetc()
    正在从文件中一个字符接一个字符地读取,并将指针向前移动到下一个字符

  • ftell()
    文件的开头。这意味着它会告诉它现在指向的字符的位置(因为1个字符占用1个字节)

  • 因此,您的程序从文件中读取,直到
    ftell()
    返回 小于20的位置。这意味着它将保持循环,直到从文件中读取20个字符为止

希望这能消除你的疑虑

ftell()
获取流的位置指示器的当前值(在您的示例中,它基本上返回当前指向的字符位置)

fgetc()
从指定流中获取下一个字符(无符号字符),并前进流的位置指示器。此函数用于在文件或错误结束时将读取为无符号字符转换的字符返回到int或EOF

程序流程 简单来说,这意味着-

  • fgetc()
    正在从文件中一个字符接一个字符地读取,并将指针向前移动到下一个字符

  • ftell()
    文件的开头。这意味着它会告诉它现在指向的字符的位置(因为1个字符占用1个字节)

  • 因此,您的程序从文件中读取,直到
    ftell()
    返回 小于20的位置。这意味着它将保持循环,直到从文件中读取20个字符为止


希望这能消除你的疑虑

ftell
返回文件位置指示器的当前值,
fgetc
在循环中推进文件位置指示器


但是这个程序是错误的。对于以文本模式(
“r”
)打开的流,
ftell
的返回值不能用于可移植的任何其他操作,除非查找到以前的位置。从

[…]对于文本流,其文件位置指示符包含未指定的信息,fseek函数可用于将流的文件位置指示符返回到ftell调用时的位置;两个这样的返回值之间的差异不一定是对写入或读取的字符数的有意义的度量

实际上,在这个程序中使用
ftell
没有任何意义。在二进制模式下打开文件,
“rb”
,然后保证

[…]该值是文件开头的字符数

或使用计数器变量计算从文本文件读取的字符数:

int c_read = 0;
while (c_read < 20)
{
    ch = fgetc(fp);
    putchar(ch);
    c_read ++;
}

ftell
返回文件位置指示器的当前值,
fgetc
在循环中推进文件位置指示器


但是这个程序是错误的。对于以文本模式(
“r”
)打开的流,
ftell
的返回值不能用于可移植的任何其他操作,除非查找到以前的位置。从

[…]对于文本流,其文件位置指示符包含未指定的信息,fseek函数可用于将流的文件位置指示符返回到ftell调用时的位置;两个这样的返回值之间的差异不一定是对写入或读取的字符数的有意义的度量

实际上,在这个程序中使用
ftell
没有任何意义。在二进制模式下打开文件,
“rb”
,然后保证

[…]该值是文件开头的字符数

或使用计数器变量计算从文本文件读取的字符数:

int c_read = 0;
while (c_read < 20)
{
    ch = fgetc(fp);
    putchar(ch);
    c_read ++;
}

循环中有
fgetc()
。这将提升文件位置,这就是
ftell()
报告的内容。首次以
“r”
模式打开文件时,文件位置为
0
。每次调用
fgetc()
都会将文件位置提高
1
。。。。除非在Windows环境中,文件以文本模式打开,行尾是两个字符,其中一个被跳过。因此,您将收到一个字符
'\n'
换行符,但文件指针向前移动了
2
。由于这段代码可能利用了特定于实现的行为,您能告诉我们这段代码用于哪个平台吗?关于它的用途有什么想法吗?如何使用它,它与什么类型的文件一起使用?循环中有
fgetc()
。这将提升文件位置,这就是
ftell()
报告的内容。第一次以
“r”
模式打开文件时,文件位置为
0