输入输出流总结

1.int getchar(void);//有错返回EOF,也可以指定返回值为char变量,因为这个字符包含于低位字节中(高位字节通常为0)

行缓冲输入:在键入的字符实际传送给程序之前必须敲入一个回车键。

2.int putchar(int c);//只有其低位字节被实际输出到屏幕上

返回被写入的字符,若操作失败,返回EOF(宏EOF被定义于stdio.h中,通常其值为-1)

3. int getch(void);    

  int getche(void);//不需要回车清空缓冲区

在头文件conio.h中,对于某些编译器中这些函数前面有一下划线_getch()和_getche()

4.char* gets(char* str);

测试代码:

    char str[2345];
    char* res ;
    res = gets(str);
    str[18] = '\0';
    printf("%s\n",str);
    printf("%s\n",res);

解析:str以数组形式申请,为指针常量,即不能改变指针的指向。是申请了地址空间的指针常量。

或者也可以写成char* str = (char*) malloc(2345);  res不能以指针常量形式申请,因为返回的是指针,不能改变res的指向。

5.int puts(const char* str);//不能输出数字或进行格式转换,所以与printf比较使用的空间少,速度快

    char str[] = "hello";
    int res = puts(str);
    cout<<res<<endl;

返回值为0;如果错误则为EOF

6、int printf(const char* control_string,...);

printf()函数返回写入字符的数目,如果出现一个错误,则返回control_string(控制串)有两种类型项目组成。第一类由将打印在屏幕上的字符串组成,第二类包括自定义其后变元显示方式的格式限定符。格式限定符以一个百分号开头,后跟格式化码,变元列表中的变元数与格式限定符完全相等,格式限定符与变元按顺序从左到右匹配。

7、int scanf(const char* control_string...);

可以读入各种内嵌类型并自动将其转换为适当的格式。返回成功的赋予了一个值的数据项。如果出现一个错误,scanf()返回EOF。控制串包括三类字符:

a、格式限定符 b、空白字符 c、非空白字符

8、FILE* fopen(const char*filename,const*char* mode)

打开一个文件

mode合法值如下:

r   为读操作打开一个文本文件

w   为写操作创建一个文本文件

a  附加到一个文本文件

rb  为读操作打开一个二进制文件

wb  为写操作创建一个二进制文件

ab  附加到一个二进制文件

r+  为读/写操作打开一个文本文件

w+   为读/写操作创建一个文本文件

a+  为读/写操作附加或创建一个文本文件

r+b  为读/写操作打开一个二进制文件

w+b  为读/写操作创建一个二进制文件

a+b  为读/写操作附加一个二进制文件

如果打开文件失败,fopen()返回一个空指针。

9、int fclose(FILE* fp);//返回0标志着文件关闭成功。如果关闭失败,则返回EOF。

   关闭一个由fopen()打开的文件,把留在磁盘缓冲区的数据写入文件并在操作系统级正式关闭文件。关闭流文件失败会产生各种麻烦,如:丢失数据,破坏文件和程序中出现间歇的错误等。标准函数ferror()来确定和报告出错消息

10、int putc(int ch,FILE* fp);

把一个字符写到文件中,如果操作成功,则函数返回被输出的字节;否则,返回EOF

11、int getc(FILE* fp);

从某一文件读一个字符,函数getc()读到文件尾时返回EOF标志,如果发生错误,也返回EOF。

12、fgetc(),同getc()

13、int fgets(const char*str,int length,FILE* fp);

fgets只能读取N-1个字符,包括最后的'\n',读完结束后系统将自动在最后加'\0'(gets读完结束后系统自动会将'\n'置换成'\0')。

当你从键盘上输入<=N-1个字符(包括'\n')时,那么字符串str会以‘\n\0’结尾。这就造成了strlen(str)比你想象的大 1 

   char s1[N];
   char s2[N];
   fgets(s1, N, stdin);
   if(s1[strlen(s1) - 1] == '\n') {      // 去掉换行符
        s1[strlen(s1) - 1] = '\0';
    }
    fflush(stdin);                               //清空缓冲区
    fgets(s2, N, stdin);
    if(s2[strlen(s2) - 1] == '\n') {      // 去掉换行符
        s2[strlen(s2) - 1] = '\0';
    }

    printf("%s %s", s1, s2);

没有fflush的情况下    输入:12345  输出:1234  5

有fflush: 输入12345  67890  输出 1234   6789  

将代码中的fgets改成gets   输入:123456  abcdef   输出f abcdef

14、int fputs(const char*str,FILE*fp),把str指向的字符串写到指定的流中,如果失败,则返回EOF

15、int feof(FILE* fp);

若到文件尾,返回真值.既可用于二进制文件,也可应用于文本文件

eg:

 while(!feof(fp)) ch = getc(fp);

16、int ferror(FILE* fp);

函数确定是否在文件操作期间出错。fp是有效的文件指针。在文件操作期间如果有错,则函数返回true,否则返回false。

17、void rewind(FILE* fp),把文件位置指针重新置于文件的起始位置,fp是有效的文件指针,

18、int remove(const char*filename),清除一个文件,操作成功,返回0,操作失败返回非零值。

19、int fflush(FILE* fp);

清空一个输出流的内容,将任何缓冲区的内容写到与fp相关的文件中,fflush(NULL)清空所有输出流和更新流。操作成功返回0,否则返回EOF。

20,size_t fread(void* buffer,size_t num_byte,size_t count,FILE* fp);

buffer 是一个指针,指向一个接收文件中数据的存储区,count的值指出要写多少项。返回读入的项的数目,如遇到文件的结尾或操作失败。这个值可能少于count。

21、size_t fwrite(const void * buffer,size_t num_byte,size_t count ,FILE* fp);

buffer 是一个指针,指向要写入文件中的信息快。count的值指出要写多少项。返回写入项的数目,这个值永远等于count,除非操作失败。

注意:size_t类型被定义为某种无符号整数,fp是指向已经打开流的文件指针。fwrite()和fread()最大的用途之一是可以写用户自定义的数据类型,特别是结构体类型

22、int fseek(FILE* fp,long int numbytes,int origin);

fp是由fopen()返回的指针,numbytes是从文件的origin位置到当前位置的字节,是下面的宏之一:

origin      宏名

文件开始处    SEEK_SET

当前位置    SEEK_CUR

文件末尾    SEEK_END

可以用fseek()来寻找任何数据类型的倍数,方法是用想要的项数乘以数据的长度。eg:fseek(fp,9*sizeof(struct myStruct),SEEK_SET);

23、long int ftell(FILE* fp);

决定一个文件的当前位置,返回与fp关联的文件的当前位置的地址。如果失败,返回-1.

24、int fprintf(FILE* fp,const char* control_string...);

int fscanf(FILE* fp,const char* control_string...);

注意:尽管fprintf()和scanf()是从磁盘文件中读写数据最容易的方法,但却并不是最有效的方法。由于格式化的ASCⅡ数据写入文件的格式与在屏幕上显示的相同(而不是二进制方式),因而调用时要引起额外的开销。如果要考虑速度与文件长度,最好使用fread()和fwrite()

cin、cout、cerr和C的stdin、stdout、stderr相对应。

猜你喜欢

转载自www.cnblogs.com/Lune-Qiu/p/9329449.html