#include<stdio.h>
int fgetc(FILE *stream);
/* 1 */
//每执行成功一次,文件指针移动到下一个位置
/* 2 */
//f get c
//从指定文件中 得到 一个字符
/* 3 */
//函数返回值:
//情形1:读取到的字符的ASCII值
//情形2:如果读取到文件结束符EOF,则返回-1
int fscanf(FILE *stream,const char *format,...);
/* 1 */
//会移动文件指针
/* 2 */
//在什么时候停止执行?
//情形1:遇到空格、制表符、换行符
//情形2:读取到文件末尾
//情形3:读取完指定字符串
//当fscanf遇到格式字符串中指定的非空白字符(例如空格、制表符、换行符)时,它会停止读取并等待与格式指定符相匹配的字符。
//如果我们使用%s来读取一个字符串,fscanf会自动跳过前面的空白字符,但不会跳过字符串后面的空白字符,从而确保了字符串的完整读取。而当我们使用%c来读取一个字符时,fscanf不会跳过任何空白字符,这意味着它会将空格、制表符或换行符当作有效字符来处理。
//如果在fscanf格式控制字符串前面有空格,则fscanf函数会忽略输入缓冲区中的所有空白字符(包括空格、制表符和换行符),直到找到第一个非空白字符为止。因此,如果格式控制字符串前面有空格,它将跳过任何在输入缓冲区开头的空白字符,然后读取与格式控制字符串匹配的输入。
//fscanf(stdin, " %d", &num); 这里,格式控制字符串前面有一个空格。如果我们输入" 123"(注意输入字符串前有一个空格),则fscanf将跳过输入缓冲区开头的空白字符,并读取后面的数字123。如果我们没有在格式控制字符串前面加空格,则fscanf将尝试读取输入缓冲区中的所有字符,包括开头的空格,这可能导致错误或无法预测的行为。
//假设有一个文件内容为"Hello World", 我们使用%s格式指定符来读取,fscanf会读取"Hello"后遇到空格停止,并将"Hello"存储到指定的变量中。同样的内容,如果我们使用%c来读取字符,fscanf会逐个字符读取,包括空格和换行符,这样可能会导致意外的结果,因为通常我们不希望空格被当作有效字符处理。
//如果文件内容为"123 456", 我们使用%d来读取整数,fscanf会正确地读取123,然后遇到空格停止,不会将456错误地读入同一个整数变量中。
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
//注意会移动文件指针
char *fgets(char *str, int n, FILE *stram);
/* 1 */
//会移动文件指针
/* 2 */
//什么时候读取停止?
//第一种情况:读取了n-1个字符,存入str,自动停止读取,将'\0'添加到str的末尾
//第二种情况:遇到换行符、制表符,将换行符、制表符保存到str中,然后将'\0'添加到str的末尾
/*fgets函数遇到制表符或者换行符时会停止读取。如果下一次再次调用fgets函数,它会从输入缓冲区中读取剩下的内容。因此,如果想要读取包含制表符或换行符的整行文本,可以使用fgets函数。但是如果需要读取包含制表符或者换行符的文本段,就需要使用其他函数例如fread或者fgetc来实现。*/
/* 3 */
//返回值
//成功:返回指向str的指针
//失败:返回NULL