zoukankan      html  css  js  c++  java
  • [C++STDlib基础]关于C标准输入输出的操作——C++标准库头文件<cstdio>

    网上实例

    总结

    /*
    _STD_BEGIN 
    using _CSTD clearerr; using _CSTD fclose; using _CSTD feof;
    using _CSTD ferror; using _CSTD fflush; using _CSTD fgetc;
    using _CSTD fgetpos; using _CSTD fgets; using _CSTD fopen;
    using _CSTD fprintf; using _CSTD fputc; using _CSTD fputs;
    using _CSTD fread; using _CSTD freopen; using _CSTD fscanf;
    using _CSTD fseek; using _CSTD fsetpos; using _CSTD ftell;
    using _CSTD fwrite; using _CSTD getc; using _CSTD getchar;
    using _CSTD gets; using _CSTD perror;
    using _CSTD putc; using _CSTD putchar;
    using _CSTD printf; using _CSTD puts; using _CSTD remove;
    using _CSTD rename; using _CSTD rewind; using _CSTD scanf;
    using _CSTD setbuf; using _CSTD setvbuf; using _CSTD sprintf;
    using _CSTD sscanf; using _CSTD tmpfile; using _CSTD tmpnam;
    using _CSTD ungetc; using _CSTD vfprintf; using _CSTD vprintf;
    using _CSTD vsprintf;
    _STD_END  共40个函数
    格式化输入输出(9个):printf,fprintf,sprintf,vprintf,vfprintf,vsprintf,scanf,fscanf,sscanf,
    字符的输入输出(11个):fgetc,fgets,fputc,fputs,getc,gets,getchar,putc,puts,putchar,ungetc
    直接输入输出(2个):fread,fwrite
    文件的操作(4个):remove,rename,tmpfile,tempnam
    文件的访问(6个):fclose,fopen,freopen,fflush,setbuf,setvbuf
    文件的读写定位(5个):fgetpos,fseek,fsetpos,ftell,rewind
    错误句柄(4个):clearerr,feof,ferror,perror 
    */

    实例

    #include <cstdio>
    #include <conio.h>
    #include <iostream>
    using namespace std;
    
    /*格式化输入输出
    int printf(const char *format, ...); //格式化输出数据 
    int fprintf(FILE *stream, const char *format, ...); //格式化输出数据至文件
    int sprintf(char *str, const char *format, ...); //格式化输出数据至字符串 
    //与上面不同的是下面只接受固定3个参数,一般都使用上面3个函数
    int vprintf(const char *format, va_list arg ); //格式化输出数据 
    int vfprintf(FILE *stream, const char *format, va_list arg ); //格式化输出数据至文件
    int vsprintf(char *str, const char *format, va_list arg ); //格式化输出数据至字符串  
    */
    void test0()
    {
    	char buffer [50];
    	int n, a=5, b=3;
    	n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
    	printf ("[%s] is a string %d chars long
    ",buffer,n); 
    
    	FILE * pFile; 
    	char name [100];
    	pFile = fopen ("myfile.txt","a+");
    	for (int n=0 ; n<3 ; n++)
    	{
    		puts ("please, enter a name: ");
    		gets (name);
    		fprintf (pFile, "Name %d [%-10.10s]
    ",n,name);//-:左对齐;10:宽度;.10:精度;s:字符串;宽度是10,其填充也是10个字符
    	}
    	fclose (pFile);
    	  
    	int i;
    	printf ("Enter a hexadecimal number: ");
    	scanf ("%x",&i);
    	printf ("You have entered %#x (%d).
    ",i,i);
    
    	char sentence []="Rudolph is 12 years old";
    	char str [20];
    	int ii;
    	sscanf (sentence,"%s %*s %d",str,&ii);
    	printf ("%s -> %d
    ",str,ii);//Rudolph -> 12
    }
    /*字符的输入输出:从文件中,字符串中,从STDIN/STDOUT中 获取或写入字符(串)
    int getc ( FILE * stream );//从一个文件读取一个字符
    int getchar ( void );//从STDIN(标准输入)读取一个字符
    char * gets ( char * str );//从STDIN(标准输入)读取一个字符串
    int ungetc ( int character, FILE * stream );//将参数c 字符写回参数stream 所指定的文件流. 这个写回的字符会由下一个读取文件流的函数取得.
    
    int puts ( const char * str );//写一个字符串到STDOUT(标准输出)
    int putchar ( int character );//写一个字符到STDOUT(标准输出)
    int putc ( int character, FILE * stream );//写一个字符到一个流
    int scanf(const char *format, ...); //从控制台输入
    int fscanf(FILE *stream, const char *format, ...); //从文件输入
    int sscanf(char *str, const char *format, ...); //从指定字符串输入
    
    char * fgets ( char * str, int num, FILE * stream );//从一个流获取一串字符
    int fgetc ( FILE * stream );//从流获取一个字符
    int fputs ( const char * str, FILE * stream );//写一个字符串到一个文件
    int fputc ( int character, FILE * stream );//写一个字符到一个文件
     */
    void test1()
    {
    }
    /*直接输入输出
    int fread( void *buffer, size_t size, size_t num, FILE *stream );//读取[num]个对象(每个对象大小为size(大小)指定的字节数),并把它们替换到由buffer(缓冲区)指定的数组. 数据来自给出的输入流. 函数的返回值是读取的内容数量... 
    int fwrite( const void *buffer, size_t size, size_t count, FILE *stream );//从数组buffer(缓冲区)中, 写count个大小为size(大小)的对象到stream(流)指定的流. 返回值是已写的对象的数量. 
     */
    void test2()
    {
    	FILE * pFile;
    	char buffer[] = { 'x' , 'y' , 'z' };
    	pFile = fopen ("myfile.bin", "wb");
    	fwrite (buffer , sizeof(char), sizeof(buffer), pFile);
    	fclose (pFile);
    }
    /*文件的操作:删除文件,重命名文件
    int remove ( const char * filename );//清除一个文件
    int rename ( const char * oldname, const char * newname );//重命名一个文件
    FILE *tmpfile( void );//返回一个到一个临时文件的指针
    char *tmpnam( char *name );//创建一个独特的文件名并保存在name中
     */
    void test3()
    {
    	if( remove( "myfile.txt" ) != 0 )
    		perror( "Error deleting file" );
    	else
    		puts( "File successfully deleted" ); 
    
    	char oldname[] ="oldname.txt";
    	char newname[] ="newname.txt";
    	int result= rename( oldname , newname );
    	if ( result == 0 )
    		puts ( "File successfully renamed" );
    	else
    		perror( "Error renaming file" );
    }
    /*文件的访问:打开关闭文件,设置缓冲,刷新缓存
    FILE * fopen ( const char * filename, const char * mode );//打开一个文件
    FILE * freopen ( const char * filename, const char * mode, FILE * stream );//用一个不同的名称打开一个存在的流
    int fclose ( FILE * stream );//关闭一个文件
    fflush,setbuf,setvbuf
    int fflush( FILE *stream );//如果给出的文件流是一个输出流,那么fflush()把输出到缓冲区的内容写入文件. 如果给出的文件流是输入类型的,那么fflush()会清除输入缓冲区. fflush()在调试时很实用,
    void setbuf( FILE *stream, char *buffer );//setbuf()函数设置stream(流)使用buffer(缓冲区),如果buffer(缓冲区)是null,关闭缓冲. 如果使用非标准缓冲尺寸, 它应该由BUFSIZ字符决定长度. 
    int setvbuf( FILE *stream, char *buffer, int mode, size_t size );//函数setvbuf()设置用于stream(流)的缓冲区到buffer(缓冲区),其大小为size(大小). mode(方式)可以是: _IOFBF, 表示完全缓冲 ;_IOLBF, 表示线缓冲 ;_IONBF, 表示无缓存 
     */
    void test4()
    {
    	FILE * pFile;
    	pFile = fopen ("myfile.txt","w");
    	setvbuf ( pFile , NULL , _IOFBF , 1024 );
    	if (pFile!=NULL)
    	{
    		fputs ("fopen example",pFile);
    		fclose (pFile);
    	}
    
    	freopen ("myfile.txt","w",stdout);
    	printf ("This sentence is redirected to a file.");
    	fclose (stdout);
    
    	char buffer[BUFSIZ];
    	FILE *pFile1, *pFile2;
    	pFile1=fopen ("myfile.txt","w");
    	pFile2=fopen ("myfile2.txt","a");
    	setbuf ( pFile1 , buffer );
    	fputs ("This is sent to a buffered stream",pFile1);
    	fflush (pFile1);
    	setbuf ( pFile2 , NULL );
    	fputs ("This is sent to an unbuffered stream",pFile2);
    	fclose (pFile1);
    	fclose (pFile2);
    }
    /*文件的读写定位:获取当前位置,设置到开始位置,设置到指定位置,移动到某一位置
    int fgetpos ( FILE * stream, fpos_t * pos );//获取文件位置指针
    int fsetpos ( FILE * stream, const fpos_t * pos );//在一个文件中移动到一个指定的位置
    int fseek ( FILE * stream, long int offset, int origin );//在文件中移动到一个指定的位置;origin的值应该是下列值其中之一(在stdio.h中定义): SEEK_SET 从文件的开始处开始搜索 ;SEEK_CUR 从当前位置开始搜索 ;SEEK_END 从文件的结束处开始搜索 ;fseek()成功时返回0,失败时返回非零. 
    long int ftell ( FILE * stream );//返回当前文件的位置指针
    void rewind ( FILE * stream );//移动文件位置指针到一个文件的开始处 
    */
    void test5()
    {
    	FILE * pFile;
    	fpos_t position;
    	pFile = fopen ("myfile123.txt","w");
    	fgetpos (pFile, &position);
    	fputs ("That is a sample",pFile);
    	fsetpos (pFile, &position);
    	fputs ("This",pFile);
    	fseek(pFile,0,SEEK_END);
    	fputs ( " Hello!!!" , pFile );
    	fclose (pFile);
    }
    /*错误句柄
    int feof ( FILE * stream );//如果到达文件尾(end-of-file)返回"True"(真)
    int ferror( FILE *stream );//检查stream(流)中的错误, 如果没发生错误返回0,否则返回非零
    void perror ( const char * str );//输出错误信息到STDOUT
    void clearerr( FILE *stream );//清除错误
    */
    void test6()
    {
    	FILE * pFile;
    	int n = 0;
    	pFile = fopen ("myfile9.txt","rb");
    	if (pFile==NULL) 
    	{
    		perror ("Error opening file");
    	}
    	else
    	{
    		fputc ('x',pFile);
    		if (ferror (pFile)) 
    		{
    			printf ("Error Writing to myfile.txt
    ");
    			clearerr (pFile);
    		}
    		while (fgetc(pFile) != EOF) 
    		{
    			++n;
    		}
    		if (feof(pFile)) 
    		{
    			puts ("End-of-File reached.");
    			printf ("Total number of bytes read: %d
    ", n);
    		}
    		else
    			puts ("End-of-File was not reached.");
    		fclose (pFile);
    	} 
    
    } 
    void Test(char h)
    {
    	cout<<"press key===="<<h<<endl;
    	switch(h)
    	{ 
    	case '0':  test0();break;
    	case '1':  test1();break;
    	case '2':  test2();break;
    	case '3':  test3();break; 
    	case '4':  test4();break;  
    	case '5':  test5();break;  
    	case '6':  test6();break;  
    	case 27:
    	case 'q':exit(0);break; 
    	default:cout<<"default "<<h<<endl;break;
    	}
    }
    void main()
    {  
    	while(1)
    	{
    		Test(getch());
    	} 
    } 
  • 相关阅读:
    深入理解TCP协议及其源代码
    Socket与系统调用深度分析
    构建调试Linux内核网络代码的环境MenuOS系统
    创新产品的需求分析:未来的图书会是什么样子?
    socket通信的原理与实践
    案例分析:设计模式与代码的结构特性
    网络相关的命令工具研究报告:ssh
    业务领域建模Domain Modeling
    ubuntu 设置静态ip,但显示scope global secondary ens33
    解决Python查询Mysql中文乱码问题
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3161612.html
Copyright © 2011-2022 走看看