zoukankan      html  css  js  c++  java
  • I/O(流)读写函数

    getchar()/putchar()——特殊文件指针(stdin/stdout)

    fgetc()/fputc() 和 getc()/putc()——文件指针(含stdin/stdout


    gets()/puts()——特殊文件指针(stdin/stdout)

    fgets()/fputs()——文件指针(含stdin/stdout


    fscanf()/fpintf()——文件指针(含stdin/stdout 

    sscanf()/sprintf()——存储区

    scanf()/printf()——特殊文件指针(stdin/stdout)


    fread()/fwrite() ——文件指针(含stdin/stdout

    read()/write()——文件描述符(含0/1)


    一、字符输入输出函数

    1、getchar()/putchar()

    【原   型】int getchar (void);  /  intfputchar(char c);

    【功   能】从标准输入设备(键盘)读取单个字符 / 写入一字符到标准输出设备(屏幕)

    【返回值】读取/写入字符成功则函数返回值为该字符的ASIIC值,不成功则返回值为EOF。

       getchar() <==>getc(stdin);      putchar(char ch) <==>putc(char ch,stdout);

    2、getc()/putc() 与fgetc()/fputc()

    【头文件】#include <stdio.h>

    【原   型】int fgetc ( FILE * stream );  /  int fputc(char ch, FILE* stream);  

         int getc(FILE * stream);  /  int putc(char ch, FILE* stream);

    【功   能】从流中读取单个字符 / 写入一字符到指定流     

    【参   数】参数*steam为要从中读取/写入字符的文件流;ch为要写入流中的字符。

    【返回值】读取/写入字符成功则函数返回值为该字符的ASIIC值,不成功则返回值为EOF。

    【说   明】getc()/putc()与fgetc()/fputc作用相同,但在某些库中getc()/putc()为宏定义,而非真正的函数。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int main(void){
        int ch, len, i = 0;
        FILE* fstream;
        char msg[100] = "Hello!I have read this file.";
        fstream=fopen("test.txt","at+");
        if(fstream==NULL){
            printf("read file test.txt failed!
    ");
            exit(1);
        } 
        while( (ch = getc(fstream))!=EOF){     /*getc从文件流中读取字符*/
            putchar(ch);
        }
        putchar('
    ');
        len = strlen(msg);
        while(len>0){        /*循环写入*/
            putc(msg[i],fstream);
            putchar(msg[i]);
            len--;
            i++;
        }
        fclose(fstream);
        return 0;
    }

    二、字符串输入输出函数

    gets()/puts() 与fgets()/fputs()

    【头文件】#include <stdio.h>

    【原   型】char* fgets ( char *str, int size, FILE *fp );  /  int fputs(const char *str, FILE *fp);  

         cahr* gets(char *str);  /  int puts(const char *str);

    【功   能】

    char* gets(char *str);  

    从stdin流中读取字符串,直至接受到换行符或EOF时停止,将读取的结果存放在str指针所指向的字符数组中。不读取换行符,最后自动添加一个''。,并由此来结束字符串。

    注意:

    1. gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值,为了避免这种情况,我们可以用 fgets ( buf, size, stdin )来替换gets()(在linux下,程序中用gets(),编译会有warning: the `gets' function is dangerous and should not be used)。   

    2. gets函数可以接收空格,scanf()不能接受空格。

    int puts(const char *str);

    puts()函数用来向标准输出设备(屏幕)写字符串并换行;注意:puts在输出字符串后自动换行(自动加‘ ’)

    例1:char a[5]="test"; puts(a);

    例2:puts("Hello,C:");   与   printf("Hello,C: ");   两者实现结果相同。

    char* fgets ( char *str, int size, FILE *fp );

    从fp指定的文件中读取size-1个字符到str指向的字符数组中。fgets函数读到‘ ’停止,并读取‘ ’字符,读完后再末尾自动加‘’字符。fget函数读取字符无需担心超出str置想的数组空间大小问题,它会根据数组的大小自动停止读取(当读到size-1个时停止,末尾加‘’)。一般用fgets ( buf, size, stdin )从键盘读取字符,推荐使用!!!

    int fputs(const char *str, FILE *fp);

    将str所指向的字符串写入到fp中,字符串结束标志'’不写入。str可以是字符串数组名,或者是字符串指针。

    【返回值】gets()和fgets()成功返回str,出错或者读到了末尾返回NULL。

         fputs()和puts成功返回非负数,不成功则返回值为EOF。

     

    三、格式输入输出函数

    fscanf()/fpintf() 、sscanf()/sprintf 和 scanf()/printf()

    【头文件】#include <stdio.h>

    【原   型】int fscanf(FILE * stream, const char *format, ...);

         int fprintf(FILE * stream, const char *format, ...); 

            int sscanf(const char *str, const char *format, ...);

           int sprintf(const char *str, const char *format, ...);

    【功   能】fscanf()会自参数stream 的文件流中读取字符串, 再根据参数format 字符串来转换并格式化数据。格式转换形式请参考scanf(). 转换后的结构存于对应的参数内。 

         fprintf()会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束('')为止。    

    【返回值】成功则返回输入/输出的字符个数, 失败则返回-1, 错误原因存于errno 中。 

      【说  明】int fscanf(stdin, const char *format, ...); <==> int scanf(const char *format, ...);  同理,输出函数也是如此。 

    #include <stdio.h>
    int main(void){
        int i = 150, j = -100;
        double k = 3.14159;
        fprintf(stdout, "%d %f %x 
    ", j, k, i);
        fprintf(stdout, "%2d %*d
    ", i, 2, i);  //这里中间的%*d <==> %2d,*被后面的2代替。
        return 0;
    }
    执行:
    -100 3.141590 96
    150 150
    #include <stdio.h>
    int main(void){
        int i;
        unsigned int j;
        char s[5];
        fscanf(stdin, "%d %x %5[a-z] %*s %f", &i, &j, s, s);  /*%5[a-z]:表示只接受5个a到z中的字符,%*s:表示跳过下一个字输入的符串*/ 
        printf("%d %d %s 
    ", i, j, s);
    }
    执行:
    10 0x1b aaaaaaaaa bbbbbbbbbb //从键盘输入
    10 27 aaaaa

     四、随机读写函数(I/O流操作,对象时缓冲区)

    fread()/fwrite() 

    【原   型】size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

         size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);

    【功   能】fread()从stream读取nitems个长度为size的数据到ptr所指向的缓冲区中。返回值是成功读到缓冲区中的记录个数。

         fwrite()从ptr指向的缓冲区中读取nitems个长度为size到数据,并把它们写到stream所对应的文件中。

    【返回值】函数返回的不是读取/写入的字节数,而是读取/写入的对象数(向下取整)。

    【说   明】stream为用fopen函数返回的文件结构指针。 

    #include <stdio.h>
    #inlcude <stdlib.h>
    #include <string.h>
    int main(void){
        FILE *p_file = fopen("test.txt", "w+");    /*打开一个文件,没有就创建*/
        if(NULL == p_file){
            printf("Failed to open file!");
            exit(EXIT_FAILURE);
        }
        size_t r = 0;
        int str[] = {1,2,3,4,5};
        int num = 0;
        char buf[2] = {0};
        printf("%lu
    ", fwrite(str, sizeof(int), 5, p_file));  /*将数组中的数据写入到文件*/
        rewind(p_file);        /*重置文件操作位置(文件开始处)*/
        while((r=fread(&num, sizeof(int), 1, p_file))){    /*每次从文件中读一个sizeof(int)大小的对象*/
            sprintf(buf, "%d%c", num, ' ');                /*将数据转换成字符格式*/
            fwrite(buf, strlen(buf), r, stdout);        /*将字符格式的数据输出到屏幕*/
            //fprintf(stdout, "%d ", num);                /*以上两部可可合并成一步*/
        }
        printf("
    ");
        fclose(p_file);
        p_file = NULL;
        return 0;
    }

    五、文件读写函数(基本I/O操作)

    read()/write() 

    【原   型】ssize_t read(int fd,void *buf,size_t nbytes)

         ssize_t write(int fd,const void *buf,size_t nbytes)

    【功   能】read()从fd指定的文件中读取nbytes字节数到buf对应的空间中。

         write()将buf对应的空间中读取nbytes个字节到fd指定的文件中。

    【返回值】read()

    1. 成功时,>0返回read()实际读的字节数,=0表示已经读到文件的结束了;<0表示出现了错误。

    2. 如果错误为EINTR说明读是由中断引起的, 如果是ECONNREST表示网络连接出了问题。

     write()

    1. 成功时,返回write()入字节数;失败时返回-1,并设置errno变量。

    2. 返回的值小于0,此时出现了错误,我们要根据错误类型来处理; 如果错误为EINTR表示在写的时候出现了中断错误;
    如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接)。

  • 相关阅读:
    【Mybatis】 JdbcType 与 JavaType对应关系
    【入门知识】虚拟机化概念
    【Ubuntu 16】安装deb
    【Ubuntu 16】安装eclipse
    【刷题】HDU 4405 Aeroplane chess
    【刷题】BZOJ 3998 [TJOI2015]弦论
    【刷题】SPOJ 1812 LCS2
    【刷题】BZOJ 2882 工艺
    【刷题】UOJ #171 【WC2016】挑战NPC
    【刷题】UOJ #79 一般图最大匹配
  • 原文地址:https://www.cnblogs.com/love-lzb/p/6880839.html
Copyright © 2011-2022 走看看