fscanf和fgets用法

首先要对fscanf和fgets这两个文件函数的概念有深入的了解,对于字符串输入而言这两个函数有一个典型的区别是:
          fscanf读到空格或者回车时会把空格或回车转化为/0(字符串结束符)而fgets函数则把空格(回车在下文解释)作为字符接收。
          有这样一个例子:
char str[13];
scanf("%s",str);
          如果输入以下12个字符How are you?回车
          实际上并不是把这12个字符加上/0送到数组str中,而只将空格前的“How”送到str中,由于把“How”作为一个字符串处理,因此在其后加/0。
          现在我们来看一看在题目的第一个循环中,用gets函数接受字符串的情况。
          1、输入“ABC回车DEF”。
          现在我们来说以下fgets函数对于回车的处理方法。
          fgets函数的定义是这样的:
          char *fgets(char *s,int n,FILE *fp)
          当fgets读到回车符时,函数会结束,把回车符也作为一个字送入参数s指向的缓冲区(注意是缓冲区而不是内存),fgets()函数在读取结束后,再向缓冲区送一个/0字符,从而使缓冲区的字符成为C字符串。
          也就是说fgets函数读到回车的时候,不象fscanf函数那样在内存中把回车转换/0,而是在缓冲区里面处理的。这样处理的结果是回车不起作用,也就是说当我们输入ABC回车DEF时,ABCDEF在内存中是连续存放的。所以在第二个循环输出时自然不会换行。
          2、输入“I AM A STUDENT”,在字符中间加空格。
          在第一次循环中,用fgets读入的结果是“I AM A STUDENT”,空格作为字符处理。那么在第二次循环中,用fscanf读入 “I AM A STUDENT”后将字符串中的空格转换为了/0,也就上将一个字符串分成了四个"I" "AM" "A" "STUDENT"。在这里可能有人要问,那么既然加了/0,为什么循环在读到/0还能继续呢?要注意的是循环的结束条件是EOF(文件结束)而不是/0(文件结束符)。
          第一次输出"I" 遇到/0输出回车结束,继续判断循环条件发现文件并没有结束,那么继续输出"AM"和回车.......一直到"STUDENT"回车。
          补充一个问题,如果想让"I" "AM" "A" "STUDENT"输出在同一行上程序应该怎么改?
          答案就是:fscanf换成fgets(fp, str) 。
时间: 2024-07-30 23:45:37

fscanf和fgets用法的相关文章

函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)

函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针): 其中的n是一个正整数.表示从文件中读出的字符串不超过 n-1个字符.在读入的最后一个字符后加上串结束标志'\0'.例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入 字符数组str中. [例10.

fgets()用法笔记

为了避免缓冲区溢出,从终端读取输入时应当用fgets()代替gets()函数.但是这也将带来一个问题,因为fgets()的调用格式是: fgets (buf, MAX, fp)fgets (buf, MAX, stdin) buf是一个char数组的名称,MAX是字符串的最大长度,fp是FILE指针.fgets()函数读取到它所遇到的第一个换行符的后面,或者读取比字符串的最大长度少一个的字符,或者读取到文件结尾.然后fgets()函数向末尾添加一个空字符以构成一个字符串.如果在达到字符最大数目之

Linux C 文件输入输出函数 fopen()、getc()、putc()、fclose()、fprintf()、fscanf()、fgets()、fputs()、fseek()、ftell()、fgetpos()、fsetpos() 详解

  fopen(打开文件) 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r     打开只读文件,该文件必须存在. r+   打开可读写的文件,该文件必须存在. w    打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件. w+ 打开可读写文件,若文件存在则文件长度清

文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets

clearerr(清除文件流的错误旗标) 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * stream); 函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标. 返回值 fclose(关闭文件) 相关函数 close,fflush,fopen,setbuf 表头文件 #include<stdio.h> 定义函数 int fclose(FILE * stream); 函数说明 fclos

fopen和fopen_s用法的比较

fopen和fopen_s用法的比较 fopen 和 fopen_s           fopen用法: fp = fopen(filename,"w").         fopen_s用法:,须定义另外一个变量errno_t err,然后err = fopen_s(&fp,filename,"w").        返回值: fopen打开文件成功,返回文件指针(赋值给fp),打开失败则返回NULL值:                       fo

fscanf()函数详解【转】

本文转载自:http://blog.csdn.net/liangxanhai/article/details/8026496 以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析有规律的文件.今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数.哎 以前自己做了这么多无用功,在这里详细解析一下fscanf函数: fscanf()函数(有点像正则表达式): 功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结

转: fscanf()函数详解

以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析有规律的文件.今天突然发现c的库函数中有一个现成的可以解析有规律的文件的函数,就是fscanf()函数.哎 以前自己做了这么多无用功,在这里详细解析一下fscanf函数: fscanf()函数(有点像正则表达式): 功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束. 用 法:int fscanf(FILE *stream, char *format,[argument...]); in

C语言4——文件操作

1.文件操作 int main(){ FILE *p=fopen("D:\\temp\\a.txt","w");//用写的方式打开一个文件 //w的意思是如果文件不存在就建立一个,如果文件存在就覆盖 fputs("hello world",p);//向文件中写入一个字符串 fclose(p);//关闭文件 } int main(void){ char s[1024]={0}; FILE *p=fopen("D:\\temp\\a.txt

c提高

一.内存管理: 内存四区: 1.一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域. 代码块是{}之间的一段代码 2.register寄存器变量 通常变量在内存当中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高 register int I 3.全局函数和静态函数 在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态,静态函数只能在当前函数内使用 4.代码区 代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段