精华内容
下载资源
问答
  • C语言输入函数专辑

    2019-10-07 10:43:02
    1、scanf()C语言中数据的标准输入函数 功能:执行格式化输入 用法:int scanf(char *format[,argument,...]); scanf()函数是通用终端格式输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入...

        I/O作为编程的基本元素,具有非常重要的作用,但因为常用所以有些细节也常常被我忽略,所以写这样一篇专辑来对C语言的输入输出作总结。

    1、scanf()C语言中数据的标准输入函数

    • 功能:执行格式化输入
    • 用法:int scanf(char *format[,argument,...]);
    • scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
    • 其调用格式为: scanf("",);
    • 返回值:scanf()函数返回成功赋值的数据项数,出错时或者遇到文件结束符则返回EOF(一般在stdio.h中被宏定义为-1);除了文件结束,做题遇见最多的是标准输入,但是标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF:
      Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF;
      Windows中,Ctrl-Z表示EOF。
    • 其控制串由三类字符构成:
      1.格式化说明符;
      2.空白符;
      3.非空白符;

      一、空白符

          空格,制表符和换行,一般scanf函数(格式字符为%c时除外)会在读操作中略去输入中一个或多个空白符,空白符可以,直到第一个非空白字符出现为止,遇到空白字符时读取停止,并把空白字符留在输入队列中。

      二、非空白符

          一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符(比如输入时我们想在输入元素之间输入逗号)。

      三、特别说明%c和%s
          %s 是读字符串,读取时开始时忽略空白符,从第一非空白符开始读,直到遇到空白符停止,并且会将空白符留在输入缓冲区
      %c是读字符,任何字符都可以读取(包括空白符)
      测试代码:
    #include<stdio.h>
    int main()
    {
    char str[10];
    char ch;
    scanf("%s", str);
    scanf("%c", &ch);
    printf("%s\n", str);
    printf("%c", ch);
    return 0;
    }
    
    输入
    1234_123
    
    输出
    1234
    空格

        对于第一个%s读入时遇到分隔符“空格”就停止,但是空格还是保存在缓冲区的。对于%c读入时候,“空格、\n、TAB”等是正常字符,所以第二次读入时候读取缓冲中的第一个字符“空格”。所以可以在两个scanf()函数之后加个fflush(stdin);,还有加getch(); getchar();也能够。

    • 扩展:
      函数名: fflush
      功 能: 清除一个流
      用 法: int fflush(FILE *stream);
    #include <stdio.h>
    int main()
    {
        int a;
        char c;
        do
        {
            scanf("%d",&a);
            fflush(stdin);
            scanf("%c",&c);
            fflush(stdin);
            printf("a=%d     c=%c/n",a,c);
        }while(c!='N');
    }
    四、格式化说明符

    格式字符 说明
    %a 读入一个浮点值(仅C99有效)
    %A 同上
    %c 读入一个字符
    %d 读入十进制整数
    %i 读入十进制,八进制,十六进制整数
    %o 读入八进制整数
    %x 读入十六进制整数
    %X 同上
    %c 读入一个字符
    %s 读入一个字符串
    %f 读入一个浮点数
    %F 同上
    %e 同上
    %E 同上
    %g 同上
    %G 同上
    %p 读入一个指针
    %u 读入一个无符号十进制整数
    %n 至此已读入值的等价字符数
    %[] 扫描字符集合
    %% 读%符号

    附加格式说明字符表
    修饰符 说明
    L/l 长度修饰符 输入"长"数据
    h 长度修饰符 输入"短"数据
    W 整型常数 指定输入数据所占宽度
    * 星号 空读一个数据

    2、getchar()C语言单字符输入函数

    • 功能:从stdin流中读取一个字符(包括空格、回车和Tab)
    • 用法:int getchar(void);(参数为空)
    • 返回值:正确读取返回读取字符的ASCLL码,出错时返回-1;
    • 注解:当程序调用getchar()时.运行程序时就等着用户从按键输入,用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中),当用户键入回车之后,getchar才开始从输入流中每次读入一个字符,输入的字符不只一个的时候,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完之后,才等待用户按键,getchar函数输入数字也按字符处理,单个的getchar函数输入多于一个字符时,只接收第一个字符。
    • 扩展:getch()
      用法:int getch(void),必须引入“conio.h”;
      功能:从标准输入设备(键盘)读入一个字符,不回显在显示器上。
      返回值:正确读取返回读取字符的ASCLL码,出错时返回-1;
      注解:getch()直接从键盘获取数据,不等待用户按回车,只要用户按一个键,getch就立刻返回并且输入结果不回显。
    • 扩展:getche()
      用法:int getche(void),必须引入“conio.h”;
      功能:从标准输入设备(键盘)读入一个字符,回显在显示器上。
      返回值:正确读取返回读取字符的ASCLL码,出错时返回-1;
      注解:getche()直接从键盘获取数据,不等待用户按回车,只要用户按一个键,getche就立刻返回并且输入结果回显。
      测试代码:
    #include<stdio.h>
    #include<conio.h>
    int main(int argc, char const *argv[])
    {
        char ch;
        ch = getche();
        //ch = getch();
        //ch = getchar();
        printf("%c\n",ch );
        return 0;
    }

    3、gets()字符串读取函数

    • 功能:是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间,读取时直至接收到换行符或 EOF 时停止
    • 用法:char gets(char str);
    • 返回值:读入成功,则返回与参数 buffer 相同的指针;如果读入过程中遇到 EOF;
      或发生错误,返回 NULL 指针。
    • 注解:需要注意的是,换行符不作为读取串的内容但是可以读取空格,读取的换行符被转换为 null(’\0’) 值,并由此来结束字符串。即换行符会被丢弃,然后在末尾添加 null(’\0’) 字符。函数 gets 可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。也就是说,gets函数并不检查缓冲区buffer的空间大小,事实上它也无法检查缓冲区的空间,这是gets的危险所在,相对的规定了读取字符串最大长度的fgets()就变成了安全的替代者。
    • 扩展:fgets()
      用法:# include <stdio.h> char fgets(char s, int size, FILE *stream);
      参数: s:字符型指针,指向存储读入数据的缓冲区的地址;size:从流中读入n-1个字符;steam:指向读取的流(可以是标准输入流 stdin即键盘输入,也可以是文件流)。
      作用:同gets(),只是多了字符串大小限制,更安全。
      返回值:1.当size<=0 时返回NULL,即空指针;2.当size=1时,返回空串"";3.如果读入成功,则返回缓冲区的地址;4.如果读入错误或遇到文件结尾(EOF),则返回NULL。
      标准库代码:
     char *fgets(char *s, int n,  FILE *stream)
       {
         register int c;
         register char *cs;
         cs=s;
         while(--n>0 &&(c = getc(stream))!=EOF)//注意是--n,所以只读n-1个字符
         if ((*cs++=  c) =='\n')  //空间足够的时候会取出换行符
               break;
         *cs ='\0';  //最后加入‘\0’
         return (c == EOF && cs == s) ?NULL :s ;
        }
    • 注解:1.如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,并读入,fgets()会返回。并且在s的最后插入字符串结束标志'\0'。 而s缓冲区剩余的位置不会再填充。
      2.如果n小于等于一行的字符串的长度,那么读入n-1个字符,此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'。fgets()和gets()一样,最后的回车都会从缓冲区中取出来。只不过 gets() 是取出来丢掉,而fgets()是取出来自己留着。那么同样不需要清空缓冲区。

      4、缓冲区

      4.1、缓冲区类型

    • C语言的标准输入输出是分缓冲和无缓冲的。这里面缓冲分为全缓冲和行缓冲。
    • 全缓冲: 全缓冲是指当缓冲区满了才进行I/O的读写操作。一般磁盘文件是全缓冲的(缓冲区一般为4096个字节);全缓冲的典型代表是对磁盘文件的读写。
    • 行缓冲:行缓冲是指遇到换行符(即’\n’)后进行I/O操作,当然缓冲区满了也要进行操作。注意:换行符也被读入缓冲区;(缓冲区一般为1024个字节)典型代表是键盘输入数据。
    • 无缓冲:也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

      4.2、缓冲区的刷新

      缓冲区会在以下三种情况下被刷新:
      1、缓冲区满
      2、执行flush刷新缓冲区的语句
      3、程序正常结束。
    • 拓展:一般地,标准输入stdin和标准输出stdout为行缓冲,标准错误输出stderr无缓冲。但是ANSI C要求下列缓存特征(参考APUE):
      当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。
      标准出错决不会是全缓存的。
      但是,很多系统是这么实现的:
      涉及到交互时,标准输入输出为行缓冲,否则为全缓冲
      标准错误输出总是无缓冲
      Unix中用宏_IO_LINE_BUF和_IO_UNBUFFERED(#include <stdio.h>即可)来判断流属于哪个缓冲类型,判断方法(以stdin举例)为:用stdin->_flags与_IO_LINE_BUF和_IO_UNBUFFERED进行按为与运算,如果运算结果不为0,则为相应的缓冲类型;如果二者都为0,那么就是全缓冲。

    转载于:https://www.cnblogs.com/shrimp-meat/p/10392905.html

    展开全文
  • C语言的基本输入与输出函数1.1.1 格式输入输出函数Turbo C2.0 标准库提供了两个控制台格式输入、 输出函数printf() 和scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。printf()函数用来...

    C语言的基本输入与输出函数

    1.1.1 格式化输入输出函数

    Turbo C2.0 标准库提供了两个控制台格式化输入、 输出函数printf() 和scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入设备(键盘)上读数据。

    一、printf()函数

    printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为:printf(“”, );其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出,例如printf(“风雨兼程\n”); 另一部分是格式化规定字符, 以”%”开始, 后跟一个或几个规定字符,用来确定输出内容格式。参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用“,”分开, 且顺序一一对应, 否则将会出现意想不到的错误。

    格式化规定符

    Turbo C2.0提供的格式化规定符如下:

    ━━━━━━━━━━━━━━━━━━━━━━━━━━

    符号 作用

    ——————————————————————————

    %d 十进制有符号整数

    %u 十进制无符号整数

    %f 浮点数

    %s 字符串

    %c 单个字符

    %p 指针的值

    %e 指数形式的浮点数

    %x, %X 无符号以十六进制表示的整数

    %0 无符号以八进制表示的整数

    %g 自动选择合适的表示法

    ━━━━━━━━━━━━━━━━━━━━━━━━━━

    说明:

    (1). 可以在“%”和字母之间插进数字表示最大场宽。例如: %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6,小数点占一位, 不够9位右对齐。%8s 表示输出8个字符的字符串, 不够8个字符右对齐。

    (2). 可以控制输出左对齐或右对齐, 即在“%”和字母之间加入一个”-” 号可说明输出为左对齐, 否则为右对齐。例如: %-7d 表示输出7位整数左对齐。如果字符串的长度或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出;若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。另外, 若想在输出值前加一些0, 就应在场宽项前加个0。例如: d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度,小数点前的数字代表最小宽度。例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。

    (3). 可以在“%”和字母之间加小写字母l, 表示输出的是长型数。例如: %ld 表示输出long整数%lf 表示输出double浮点数。

    一些特殊规定字符

    ━━━━━━━━━━━━━━━━━━━━━━━━━━

    字符 作用

    ——————————————————————————

    \n 换行

    \f 清屏并换页

    \r 回车

    \t Tab符

    \xhh 表示一个ASCII码用16进表示,

    其中hh是1到2个16进制数

    ━━━━━━━━━━━━━━━━━━━━━━━━━━

    编制下面的程序,以加深对Turbo C2.0数据的了解

    例1

    include

    include

    int main()

    {

    char c, s[20], *p;

    int a=1234, *i;

    float f=3.141592653589;

    double x=0.12345678987654321;

    p="How do you do";

    strcpy(s, "Hello, Comrade");

    *i=12;

    c='\x41';

    printf("a=%d\n", a); /结果输出十进制整数a=1234/

    printf("a=%6d\n", a); /结果输出6位十进制数a= 1234/

    printf("a=%06d\n", a); /结果输出6位十进制数a=001234/

    printf("a=%2d\n", a); /a超过2位, 按实际值输出a=1234/

    printf("i=%4d\n", i); /输出4位十进制整数i= 12*/

    printf("i=%-4d\n", i); /输出左对齐4位十进制整数i=12*/

    printf("i=%p\n", i); /输出地址i=06E4/

    printf("f=%f\n", f); /输出浮点数f=3.141593/

    printf("f=6.4f\n", f); /输出6位其中小数点后4位的浮点数f=3.1416/

    printf("x=%lf\n", x); /输出长浮点数x=0.123457/

    printf("x=%18.16lf\n", x);/输出18位其中小数点后16位的长浮点数x=0.1234567898765432/

    printf("c=%c\n", c); /输出字符c=A/

    printf("c=%x\n", c); /输出字符的ASCII码值c=41/

    printf("s[]=%s\n", s); /输出数组字符串s[]=Hello, Comrade/

    printf("s[]=%6.9s\n", s);/输出最多9个字符的字符串s[]=Hello, Co/

    printf("s=%p\n", s); /输出数组字符串首字符地址s=FFBE/

    printf("p=%s\n", p); / 输出指针字符串p=How do you do*/

    printf("p=%p\n", p); /输出指针的值p=0194/

    getch();

    retunr 0;

    }

    二、scanf()函数

    scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。其调用格式为:scanf(“”, );格式化字符串包括以下三类不同的字符;

    格式化说明符: 格式化说明符与printf()函数中的格式说明符基本相同。

    空白字符: 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。

    非空白字符: 一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。地址表是需要读入的所有变量的地址, 而不是变量本身。这与printf()函数完全不同, 要特别注意。各个变量的地址之间同“,”分开。

    例1:

    int i,j;

    scanf(“%d, %d”, &i, &j);

    上例中的scanf()函数先读一个整型数, 然后把接着输入的逗号剔除掉, 最后读入另一个整型数。如果“,”这一特定字符没有找到, scanf()函数就终止。若参数之间的分隔符为空格, 则参数之间必须输入一个或多个空格。

    说明:

    (1). 对于字符串数组或字符串指针变量, 由于数组名和指针变量名本身就是地址, 因此使用scanf()函数时, 不需要在它们前面加上”&”操作符。

    例2

    main()

    {

    char *p, str[20];

    scanf(“%s”, p);

    scanf(“%s”, str);

    printf(“%s\n”, p);

    printf(“%s\n”, str);

    }

    (2). 可以在格式化字符串中的“%”各格式化规定符之间加入一个整数, 表示任何读操作中的最大位数。如例2中若规定只能输入10字符给字符串指针p, 则第一条scanf() 函数语句变为scanf(“s”, p);程序运行时一旦输入字符个数大于10, p就不再继续读入, 而后面的一个读入函数即scanf(“%s”, str)就会从第11个字符开始读入。实际使用scanf()函数时存在一个问题, 下面举例进行说明:当使用多个scanf()函数连续给多个字符变量输入时, 例如:

    main()

    {

    char c1, c2;

    scanf(“%c”, &c1);

    scanf(“%c”, &c2);

    printf(“c1 is %c, c2 is %c”, c2, c2);

    }

    运行该程序, 输入一个字符A后回车 (要完成输入必须回车), 在执行scanf(“%c”, &c1)时, 给变量c1赋值”A”, 但回车符仍然留在缓冲区内, 执行输入语句scanf(”%c”, &c2)时, 变量c2输出的是一空行, 如果输入AB后回车, 那么输出结果为: c1 is A, c2 is B。要解决以上问题, 可以在输入函数前加入清除函数fflush()。修改以上程序变成:

    include

    main()

    {

    char c1, c2;

    scanf(“%c”, &c1);

    fflush(stdin);

    scanf(“%c”, &c2);

    printf(“c1 is %c, c2 is %c”, c1, c2);

    }

    1.1.2 非格式化输入输出函数

    非格式化输入输出函数可以由上面讲述的标准格式化输入输出函数代替, 但这些函数编译后代码少, 相对占用内存也小, 从而提高了速度, 同时使用也比较方便。下面分别进行介绍。

    一、puts()和gets()函数

    puts()函数puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为:puts(s);其中s为字符串变量(字符串数组名或字符串指针)。puts()函数的作用与语printf(”%s\n”, s)相同。

    例3:

    main()

    {

    char s[20], *f;

    strcpy(s, “Hello! Turbo C2.0″);

    f=“Thank you”;

    puts(s);

    puts(f);

    }

    说明:

    (1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。

    (2). 可以将字符串直接写入puts()函数中。如:puts(“Hello, Turbo C2.0”);

    gets()函数

    gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符不属于这个字符串。其调用格式为:gets(s);其中s为字符串变量(字符串数组名或字符串指针)。gets(s)函数与scanf(“%s”, &s)相似, 但不完全相同, 使用scanf(“%s”, &s)函数输入字符串时存在一个问题, 就是如果输入了空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理, 但gets() 函数将接收输入的整个字符串直到回车为止。

    例4

    main()

    {

    char s[20], *f;

    printf(“What’s your name?\n”);

    gets(s);

    puts(s);

    puts(“How old are you?”);

    gets(f);

    puts(f);

    }

    说明:(1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。(2). 可以将字符串直接写入puts()函数中。如:puts("Hello, Turbo C2.0");

    gets()函数

    gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符不属于这个字符串。其调用格式为:gets(s);其中s为字符串变量(字符串数组名或字符串指针)。 gets(s)函数与scanf("%s", &s)相似, 但不完全相同, 使用scanf("%s", &s)函数输入字符串时存在一个问题, 就是如果输入了空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理, 但gets() 函数将接收输入的整个字符串直到回车为止。

    例5

    main()

    {

    char s[20], *f;

    printf("What's your name?\n");

    gets(s); /*等待输入字符串直到回车结束*/

    puts(s); /*将输入的字符串输出*/

    puts("How old are you?");

    gets(f);

    puts(f);

    }

    说明:(1). gets(s)函数中的变量s为一字符串。如果为单个字符, 编译连接不会有错误, 但运行后会出现"Null pointer asignmemt"的错误。

    二、putchar()、getch()、getche()和getchar()函数

    putchar()函数

    putchar()函数是向标准输出设备输出一个字符, 其调用格式为:putchar(ch);其中ch为一个字符变量或常量。putchar()函数的作用等同于printf("%c", ch);

    例6:

    include

    main()

    {

    char c: /*定义字符变量*/

    c='B'; /*给字符变量赋值*/

    putchar(c); /*输出该字符*/

    putchar('\x42'); /*输出字母B*/

    putchar(0x42); /*直接用ASCII码值输出字母B*/

    }

    从本例中的连续四个字符输出函数语句可以分清字符变量的不同赋值方法。

    getch()、getche()和getchar()函数

    (1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符。其调用格式为:getch(); getche();两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche()函数却将读入的字符回显到显示屏幕上。

    例7:

    include

    main()

    {

    char c, ch;

    c=getch(); /*从键盘上读入一个字符不回显送给字符变量c*/

    putchar(c); /*输出该字符*/

    ch=getche(); /*从键盘上带回显的读入一个字符送给字符变量ch*/

    putchar(ch);

    }

    利用回显和不回显的特点, 这两个函数经常用于交互输入的过程中完成暂停等功能。

    例8:

    include

    main()

    {

    char c, s[20];

    printf("Name:");

    gets(s);

    printf("Press any key to confinue...");

    getch(); /*等待输入任一键*/

    }

    (2) getchar()函数

    getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数的区别在于: getchar()函数等待输入直到按回车才结束, 回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。getchar()函数的调用格式为:getchar();

    例9:

    include

    main()

    {

    char c;

    c=getchar(); /*从键盘读入字符直到回车结束*/

    putchar(c); /*显示输入的第一个字符*/

    getch(); /*等待按任一健*/

    }

    1.2 文件的输入输出函数

    键盘、显示器、打印机、磁盘驱动器等逻辑设备, 其输入输出都可以通过文件管理的方法来完成。而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 详细介绍Turbo C2.0提供的文件操作函数, 当然这些对文件的操作函数也适合于非磁盘文件的情况另外, Turbo C2.0提供了两类关于文件的函数。一类称做标准文件函数也称缓冲型文件函数, 这是ANSI标准定义的函数; 另一类叫非标准文件函数, 也称非缓冲型文件函数。这类函数最早公用于UNIX操作系统, 但现在MS-DOS3.0 以上版本的操作系统也可以使用。下面分别进行介绍。

    1.2.1 标准文件函数

    标准文件函数主要包括文件的打开、关闭、读和写等函数。不象BASIC 、FORTRAN语方有顺序文件和随机文件之分, 在打开时就应按不同的方式确定。Turbo C2.0并不区分这两种文件, 但提供了两组函数, 即顺序读写函数和随机读写函数。

    一、文件的打开和关闭

    任何一个文件在使用之前和使用之后, 必须要进行打开和关闭, 这是因为操作系统对于同时打开的文件数目是有限制的, DOS操作系统中,可以在DEVICE.SYS中定义允许同时打开的文件数n(用files=n定义)。其中n 为可同时打开的文件数, 一般n<=20。因此在使用文件前应打开文件, 才可对其中的信息进行存取。用完之后需要关闭, 否则将会出现一些意想不到的错误。Turbo C2.0提供了打开和关闭文件的函数。

    fopen()函数

    fopen函数用于打开文件, 其调用格式为:FILE *fopen(char *filename, *type);在介绍这个函数之;前, 先了解一下下面的知识。

    (1) 流(stream)和文件(file)

    流和文件 在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设备之间提供了一层抽象的东西, 称之为"流", 而将具体的实际设备叫做文件。流是一个逻辑设备, 具有相同的行为。因此, 用来进行磁盘文件写的函数也同样可以用来进行打印机的写入。在Turbo C2.0中有两种性质的流: 文字流( textstream)和二进制(binary stream)。对磁盘来说就是文本文件和二进制文件。本软件为了便于让读者易理解Turbo C2.0语言而没有对流和文件作特别区分。

    (2) 文件指针FILE

    实际上FILE是一个新的数据类型。它是Turbo C2.0的基本数据类型的集合,称之为结构指针。有关结构的概念将在第四节中详细介绍, 这里只要将FILE理解为一个包括了文件管理有关信息的数据结构, 即在打开文件时必须先定义一个文件指针。

    (3) 以后介绍的函数调用格式将直接写出形式参数的数据类型和函数返回值的数据类型。例如: 上面打开文件的函数, 返回一个文件指针, 其中形式参数有两个, 均为字符型变量(字符串数组或字符串指针)。本软件不再对函数的调用格式作详细说明。现在再来看打开文件函数的用法。 fopen()函数中第一个形式参数表示文件名, 可以包含路径和文件名两部分。如:

    "B:TEST.DAT"

    "C:\\TC\\TEST.DAT"

    如果将路径写成"C:\TC\TEST.DAT"是不正确的, 这一点要特别注意。第二个形式参数表示打开文件的类型。关于文件类型的规定参见下表。

    表 文件操作类型

    ━━━━━━━━━━━━━━━━━━━━━━━━

    字符 含义

    ──────────────────────────────────

    "r" 打开文字文件只读

    "w" 创建文字文件只写

    "a" 增补, 如果文件不存在则创建一个

    "r+" 打开一个文字文件读/写

    "w+" 创建一个文字文件读/写

    "a+" 打开或创建一个文件增补

    "b" 二进制文件(可以和上面每一项合用)

    "t" 文这文件(默认项)

    ━━━━━━━━━━━━━━━━━━━━━━━━

    如果要打开一个CCDOS子目录中, 文件名为CLIB的二进制文件, 可写成:fopen("c:\ccdos\clib", "rb");

    如果成功的打开一个文件, fopen()函数返回文件指针, 否则返回空指针(NULL)。由此可判断文件打开是否成功。

    fclose()函数

    fclose()函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为: int fclose(FILE *stream); 该函数返回一个整型数。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。

    例10:

    iclude

    main()

    {

    FILE *fp; /*定义一个文件指针*/

    int i;

    fp=fopen("CLIB", "rb"); /*打开当前目录名为CLIB的文件只读*/

    if(fp==NULL) /*判断文件是否打开成功*/

    puts("File open error");/*提示打开不成功*/

    i=fclose(fp); /*关闭打开的文件*/

    if(i==0) /*判断文件是否关闭成功*/

    printf("O,K"); /*提示关闭成功*/

    else

    puts("File close error");/*提示关闭不成功*/

    }

    二、有关文件操作的函数

    文件的顺序写函数

    fprintf()、fputs()和fputc()函数函数fprintf()、fputs()和fputc()均为文件的顺序写操作函数, 其调用格式如下:int fprintf(FILE *stream, char *format, );int fputs(char *string, FILE *steam);int fputc(int ch, FILE *steam);

    上述三个函数的返回值均为整型量。fprintf() 函数的返回值为实际写入文件中的字罕个数(字节数)。如果写错误, 则返回一个负数, fputs()函数返回0时表明将string指针所指的字符串写入文件中的操作成功, 返回非0时, 表明写操作失败。fputc()函数返回一个向文件所写字符的值, 此时写操作成功, 否则返回EOF(文件结束结束其值为-1, 在stdio.h中定义)表示写操作错误。fprintf( ) 函数中格式化的规定与printf( ) 函数相同, 所不同的只是fprintf()函数是向文件中写入。而printf()是向屏幕输出。

    下面介绍一个例子, 运行后产后一个test.dat的文件。

    例11:

    include

    main()

    {

    char *s="That's good news"); /*定义字符串指针并初始化*/

    int i=617; /*定义整型变量并初始化*/

    FILE *fp; /*定义文件指针*/

    fp=fopne("test.dat", "w"); /*建立一个文字文件只写*/

    fputs("Your score of TOEFLis", fp);/*向所建文件写入一串字符*/

    fputc(':', fp); /*向所建文件写冒号:*/

    fprintf(fp, "%d\n", i); /*向所建文件写一整型数*/

    fprintf(fp, "%s", s); /*向所建文件写一字符串*/

    fclose(fp); /*关闭文件*/

    }

    用DOS的TYPE命令显示TEST.DAT的内容如下所示:屏幕显示

    Your score of TOEFL is: 617

    That's good news

    文件的顺序读操作函数

    fscanf()、fgets()和fgetc()函数函数fscanf()、fgets()和fgetc()均为文件的顺序读操作函数, 其调用格式如下:int fscanf(FILE *stream, char *format, );char fgets(char *string, int n, FILE *steam);int fgetc(FILE *steam);

    fscanf()函数的用法与scanf()函数相似, 只是它是从文件中读到信息。fscanf()函数的返回值为EOF(即-1), 表明读错误, 否则读数据成功。fgets()函数从文件中读取至多n-1个字符(n用来指定字符数), 并把它们放入string指向的字符串中, 在读入之后自动向字符串未尾加一个空字符, 读成功返回string指针,失败返回一个空指针。fgetc()函数返回文件当前位置的一个字符, 读错误时返回EOF。

    下面程序读取例11产生的test.dat文件, 并将读出的结果显示在屏幕上。

    例12

    include

    main()

    {

    char *s, m[20];

    int i;

    FILE *fp;

    fp=fopen("test.dat", "r");

    fgets(s, 24, fp);

    printf("%s", s);

    fscanf(fp, "%d", &i);

    printf("%d", i);

    putchar(fgetc(fp));

    fgets(m, 17, fp);

    puts(m);

    fclose(fp);

    getch();

    }

    运行后屏幕显示:

    Your score of TOEFL is: 617

    That's good news

    如果将上例中fscanf(fp, "%d", &i)改为fscanf(fp, "%s", m), 再将其后的输出语句改为printf("%s", m), 则可得出同样的结果。由此可见Turbo C2. 0中只要是读文字文件, 则不论是字符还是数字都将按其ASCII值处理。 另外还要说明的一点就是fscanf()函数读到白符时, 便自动结束, 在使用时要特别注意。

    文件的随机读写

    有时用户想直接读取文件中间某处的信息, 若用文件的顺序读写必须从文件头开始直到要求的文件位置再读, 这显然不方便。Turbo C2.0提供了一组文件的随机读写函数, 即可以将文件位置指针定位在所要求读写的地方直接读写。文件的随机读写函数如下:

    int fseek (FILE *stream, long offset, int fromwhere);

    int fread(void *buf, int size, int count, FILE *stream);

    int fwrite(void *buf, int size, int count, FILE *stream);

    long ftell(FILE *stream);

    fseek()函数的作用是将文件的位置指针设置到从fromwhere开始的第offset字节的位置上, 其中fromwhere是下列几个宏定义之一:

    文件位置指针起始计算位置fromwhere

    ━━━━━━━━━━━━━━━━━━━━━━━━━

    符号常数 数值 含义

    ───────────────────────────────────

    SEEK_SET 0 从文件开头

    SEEK_CUR 1 从文件指针的现行位置

    SEEK_END 2 从文件末尾

    ━━━━━━━━━━━━━━━━━━━━━━━━━

    offset是指文件位置指针从指定开始位置(fromwhere指出的位置)跳过的字节数。它是一个长整型量, 以支持大于64K字节的文件。fseek()函数一般用于对二进制文件进行操作。当fseek()函数返回0时表明操作成功, 返回非0表示失败。

    下面程序从二进制文件test_b.dat中读取第8个字节。

    例13:

    include

    main()

    {

    FILE *fp;

    if((fp=fopen("test_b.dat", "rb"))==NULL)

    {

    printf("Can't open file");

    exit(1);

    }

    fseek(fp, 8. 1, SEEK_SET);

    fgetc(fp);

    fclose(fp);

    }

    fread()函数是从文件中读count个字段, 每个字段长度为size个字节, 并把它们存放到buf指针所指的缓冲器中。fwrite()函数是把buf指针所指的缓冲器中, 长度为size个字节的count个字段写到stream指向的文件中去。随着读和写字节数的增大, 文件位置指示器也增大, 读多少个字节, 文件位置指示器相应也跳过多少个字节。读写完毕函数返回所读和所写的字段个数。ftell()函数返回文件位置指示器的当前值, 这个值是指示器从文件头开始算起的字节数, 返回的数为长整型数, 当返回-1时, 表明出现错误。

    展开全文
  • 头文件:#include scanf() 函数用来格式输入数据,即按用户指定的格式从键盘上把数据读入到指定的变量中。其原型为:int scanf ( char * format [ ,argument, ... ]);【参数】format为格式化控制字符串,可以由三...

    头文件:#include scanf() 函数用来格式化输入数据,即按用户指定的格式从键盘上把数据读入到指定的变量中。其原型为:

    int scanf ( char * format [ ,argument, ... ]);

    【参数】format为格式化控制字符串,可以由三类字符构成。

    1) 格式化说明符

    ------------------------------------------------------------

    格式字符 说明

    ------------------------------------------------------------

    %a 读入一个浮点值(仅C99有效)

    %A 同上

    %c 读入一个字符

    %d 读入十进制整数

    %i 读入十进制,八进制,十六进制整数

    %o 读入八进制整数

    %x 读入十六进制整数

    %X 同上

    %c 读入一个字符

    %s 读入一个字符串

    %f 读入一个浮点数

    %F 同上

    %e 同上

    %E 同上

    %g 同上

    %G 同上

    %p 读入一个指针

    %u 读入一个无符号十进制整数

    %n 至此已读入值的等价字符数

    %[] 扫描字符集合

    %% 读%符号

    另外,还有附加格式说明字符,用于追加在上面的格式说明符后面。

    -----------------------------------------------------------------

    修饰符 说明

    -----------------------------------------------------------------

    L/l 长度修饰符,输入'长'数据

    h 长度修饰符,输入'短'数据

    W 整型常数,指定输入数据所占宽度

    * 星号,空读一个数据

    hh 同 h,但仅对C99有效

    ll 同 l,但仅对C99有效

    2) 空白字符

    空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。

    3) 非空白字符

    一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。

    argument 为需要读入的所有变量的地址。

    注意,是变量地址,而不是变量标识符:

    如果是一般的变量,通常要在变量名前加上'&'取得地址,但输出时是用变量名。

    如果是数组,用数组名就代表了该数组的首地址,输出时也是用数组名

    如果是指针,直接用指针名本身,不要加上“*”,输出时也用该指针即可。

    【返回值】成功则返回被赋值的参数的个数。如果 format 和 argument 匹配错误,或者遇到结束符,那么返回值可能小于参数的个数。

    如果读取发生错误,将会返回 EOF,并设置错误标识,后续可以通过 ferror() 检测。

    如果遇到结束符,将会设置文件结束标识,后续可以通过 feof() 检测。

    如果在读取宽字符的时候发生编码错误,那么将会把 errno 设置为EILSEQ。

    【实例】下面的代码将演示 scanf() 可以读取的数据类型。

    #include int main (){ char str [80]; int i; printf ('Enter your family name: '); scanf ('%79s',str); printf ('Enter your age: '); scanf ('%d',&i); printf ('Mr. %s , %d years old.\n',str,i); printf ('Enter a hexadecimal number: '); scanf ('%x',&i); printf ('You have entered %#x (%d).\n',i,i); return 0;}运行结果为:Enter your family name: SoulieEnter your age: 29Mr. Soulie , 29 years old.Enter a hexadecimal number: ffYou have entered 0xff (255).又如,记录带空格的字符串,然后输出(已经注释的部分为要求输入三个整数,然后逐个打印出来)。

    #includeint main(){ /*int a,b,c; puts('Input a,b,c:'); scanf('%d,%d,%d',&a,&b,&c); printf('\n%d,%d,%d\n',a,b,c);*/ // 可以输入带空格的字符串*/ char str[80]; scanf('%[^\n]',str); // 格式化输入 printf('%s\n',str); // 格式化输出 return 0;}【运行结果】sdf ef13sdf ef13scanf() 函数是初学者接触最多的函数,相信大家都 已非常熟悉,这里不再赘述,但是它还有一个许多人都没有注意 到的功能,即可以记录带空格的字符串,注意学习例子中指定格式的方法。

    展开全文
  • C语言输入输出格式

    2020-08-22 21:59:29
    C语言输入输出格式符 printf函数(格式输出函数) 1.一般格式 printf(格式控制,输出表列) 例如:printf(“i=%d,ch=%c\n”,i,ch); 说明: (1)“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两...

    C语言输入输出格式符

    printf函数(格式输出函数)
    1.一般格式

    printf(格式控制,输出表列)

    例如:printf(“i=%d,ch=%c\n”,i,ch);

    说明:

    (1)“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:

    ①格式说明:由“%”和格式字符组成,它的作用是将输出的数据转换为指定的格式输出。

    ②普通字符,即需要原样输出的字符。

    (2)“输出表列”是需要输出的一些数据,可以是表达式

    (3)printf函数的一般形式可以表示为

    printf(参数1,参数2,……,参数n)

    功能是将参数2~参数n按参数1给定的格式输出

    2.格式字符(9种)

    (1)d(或i)格式符。用来输出十进制整数,有以下几种用法:

    ①%d,按整型数据的实际长度输出。

    ②%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。

    ③%ld(%mld 也可),输出长整型数据。

    例如:long a=123456;

    printf("%ld",a);

    (2)o格式符,以八进制数形式输出整数。格式:%o,%mo,%lo,%mlo都可。

    (3)x(或X)格式符,以十六进制数形式输出整数。格式:%x,%mx,%lx,%mlx都可。

    (4)u格式符,用来输出unsigned型数据,即无符号数,以十进制数形式输出。格式:%u,%mu,%lu都可。

    (5)c格式符,用来输出一个字符。格式:%c,%mc都可。

    (6)s格式符,用来输出一个字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可。

    (7)f格式符,用来输出实数(包括单、双精度),以小数形式输出。格式:%f,%m.nf,%-m.nf都可。

    注意:单精度实数的有效位数一般为7位,双精度为16位。

    (8)e(或E)格式符,以指数形式输出实数。格式:%e,%m.ne,%-m.ne都可。

    (9)g(或G)格式符,用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种)。

    3.说明

    (1)除了X、E、G(用大写字母表示)外,其他格式字符必须用小写字母;

    (2)“格式控制”字符串内可以包含转义字符;

    (3)如果想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示,如:

    printf("%f%%",1.0/3);

    (4)格式字符表参见下表

    表4.1 printf格式字符

    格式字符 说 明
    d,i 以带符号的十进制形式输出整数(正数不输出符号)
    o 以八进制无符号形式输出整数(不输出前导符0)
    x,X 以十六进制无符号形式输出整数(不输出前导符0x),用x则输出十六进制数的a~f时以小写形式输出,用X时,则以大写字母输出
    u 以无符号十进制形式输出整数
    c 以字符形式输出,只输出一个字符
    s 输出字符串
    f 以小数形式输出单、双精度数,隐含输出6位小数
    e,E 以指数形式输出实数
    g,G 选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0

    表4.2 printf的附加格式说明字符

    字符
    说明

    字母l
    用于长整型整数,可加在格式符d、o、x、u前面

    m(代表一个正整数)
    数据最小宽度

    n(代表一个正整数)
    对实数,表示输出n位小数;对字符串,表示截取的字符个数

    (二)
    c语言不提供输入输出语句,输入输出操作是由c的库函数完成。但要包含头文件stdio.h。
    putchar( ) 向终端输出一个字符 printf( )的格式字符:

    1. ① d格式符 用来输出十进制整数 %d 按整型数据的实际长度输出 %md
      使输出长度为m,如果数据长度小于m,则左补空格,如果大于m,则输出实际长度 %ld 输出长整型数据
    2. ② o格式符 以八进制形式输出整数
    3. ③ x格式符 以十六进制形式输出整数
    4. ④ u格式符 用来输出unsigned型数据,以十进制形式输出
    5. ⑤ c格式符 用来输出一个字符
    6. ⑥ s格式符 输出一个字符串 %s 输出实际长度字符串 %ms 输出的串占m列,如果串长度小于m,左补空格,如果大于m,实际输出
      %-ms输出的串占m列,如果串长度小于m,右补空格, %m.ns 输出占m列,但只取字符串中左端n个字符并靠右对齐 %-m.ns
      m、n含义同上,靠左对齐,如果n>m,则m自动取n值
    7. ⑦ f格式符 以小数形式输出实数 %f 整数部分全部输出,小数部分输出6位 %m.nf
      输出数据共占m列,其中有n位小数。如果数值长度小于m,左补空格 %-m.nf 同上,右补空格
    8. ⑧ e格式符 以指数形式输出实数 %e 系统指定6位小数,5位指数(e+002 )
    9. ⑨ g格式符 输出实数,根据数值大小,自动选f格式或e格式

    3.数据输入 getchar( ) 从终端输入一个字符 scanf( 格式控制,地址列表) 标准C scanf中不使用%u,对于unsigned型数据,以%d或%o或%x输入。%后的*,用来跳过它相应的数据。输入数据时不能规定精度如scanf( “%7.2f”, &a );是不合法的。

    展开全文
  • C语言中,使用scanf()函数获得输入信息。 以键盘输入十进制数为例,通常其输入格式为: int a; scanf("%d",&a); 注意用&符号,指明变量。 下文详述printf()函数。 在printf()函数中,通常分为2部分,...
  • c语言输入输出格式

    万次阅读 多人点赞 2018-06-11 20:39:58
    //最近被某题的输入输出卡了。。。转一波随时看。。。菜哭&lt;span style="font-family:KaiTi_GB2312;font-size:18px;...本小节介绍的是向标准输出设备显示器输出...printf函数printf函数称为格式输出函数,其...
  • C语言中scanf格式输入函数

    万次阅读 2009-10-09 11:23:00
    它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。[编辑本段]scanf函数的一般形式 scanf(格式控制,地址表列) int scanf(char *format...
  • C语言输入函数说明 scanf函数 头文件:stdio.h 原型:int scanf (const char * format,…); format 格式控制字符串; ……:可变参数列表; 返回值:输入字符的数量 小应用 使用printf函数求解一个数字n的十进制表示...
  • C语言输入输出函数 标准输入输出函数都包含在头文件stdio.h中 #include stdio.h 或 #include <stdio.h> TC系统允许在使用printf)和 scanf)两个函数时不加#include命令,但是VC++6.0确不可以不写#include <stdio.h> ...
  • scanf和 printf这两个函数分别称为格式输入函数格式输出函数。其意义是按指定的格式输入输出值。因此,这两个函数在括号中的参数都由以下两部分组成:  1) 格式控制串:格式控制串是一个字符串,必须用双引号括...
  • 【C】C语言格式输入函数scanf()详解

    万次阅读 多人点赞 2018-05-12 21:37:28
    参考了:C语言格式输入函数scanf()详解 总述 scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件...
  • 函数的第一个参数是格式字符串,它指定了输入格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置 scanf函数返回成功读入的数据项数,读入数据时遇到...
  • 输入格式: 本题目没有输入。 输出格式: 按照下列格式输出由“*”组成的倒三角图案。 回答代码: #include&lt;stdio.h&gt; int main() { printf("* * * *\n * * *\n * *\n *\n"); return 0; }.....
  • scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。 scanf函数的一般形式 scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。 scanf函数的一般形式为: scanf...
  • C语言输入输出函数

    2017-11-17 17:10:39
    1. putchar 字符输出函数 2. getchar 字符输入函数 3. printf 格式化输出函数  printf用到的格式字符: d: 十进制整数 o:八进制整数 ...4. scanf 格式输入函数 输入函数格式字符同上。 #incl
  • 关于c语言输入输出函数分析 简介: C语言中一项最重要的函数格式化输入输出函数,如常见的scanf(),printf()函数。对于初学者而言,容易不能清楚理解什么是输入什么是输出。常常将输入与输出搞混淆。对于c语言入门...
  • 文章1 Turbo C2.0标准输入输出函数和文件的输入输出函数 通过本节... Turbo C2.0 标准库提供了两个控制台格式输入 输出函数printf( ) 和 scanf, 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据 printf
  • C语言输入输出函数总结

    千次阅读 2013-05-27 15:12:26
    C语言中,输入输出函数有着相当重要的地位,它是我们的程序与用户交互的唯一途径...格式输入函数scanf( )函数,它的格式为scanf(“格式字符串”,输入列表)。“格式字符串”包含三种类型的字符:a、格式字符,以%开头
  • 第3章 输入输出函数 ;3.1 求整数的各位数字和;3.1 求整数的各位数字和; ;格式控制字符串和输出列表都是函数的参数其中 1格式控制字符串包括两个信息 格式说明符由%开头以格式字符结束的一串字符如%d%c%f等作用是将要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,936
精华内容 1,174
关键字:

c语言输入函数格式

c语言 订阅