首页 > 其他分享 >fprintf()函数的运用

fprintf()函数的运用

时间:2023-06-01 18:04:56浏览次数:43  
标签:输出 函数 stdout char fprintf sprintf 运用 open


fprintf()用于文件操作

#include <stdio.h>
   int fprintf( FILE *stream, const char *format, ... );

fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.因此fprintf()可以使得信息输出到指定的文件.比如

char name[20] = "Mary";
    FILE *out;
    out = fopen( "output.txt", "w" );
    if( out != NULL )
    fprintf( out, "Hello %s\n", name );

fprintf()和printf()一样工作.
printf是打印输出到屏幕,fprintf是打印输出到文件。
fprintf()的返回值是输出的字符数,发生错误时返回一个负值.
在有些地方,有这样的定义:printf(…)=fprintf(stdout,…).
举例用法:

#include <stdio.h>
#include<stdlib.h> 
FILE *stream;
void main( void )
{
int i = 10;
double fp = 1.5;
char s[] = "this is a string";
char c = '\n';
stream = fopen( "fprintf.out", "w" );
fprintf( stream, "%s%c", s, c );
fprintf( stream, "%d\n", i );
fprintf( stream, "%f\n", fp );
fclose( stream );
system( "type fprintf.out" );
}

屏幕输出:
this is a string
10
1.500000


sprintf

sprintf 是个变参函数,定义如下:

int sprintf( char *buffer, const char *format [, argument] ... );

函数功能:把格式化的数据写入某个字符串
函数原型:int sprintf( char *buffer, const char *format [, argument] … );
返回值:字符串长度(strlen)
例子:

char* who = "I";
char* whom = "CSDN";
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "  这字符串写到s中
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"

char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
如果:
sprintf(s, "%s%s", a1, a2); //Don't do that!
//十有八九要出问题了。是否可以改成:
sprintf(s, "%7s%7s", a1, a2);
//也没好到哪儿去,正确的应该是:
sprintf(s, "%.7s%.7s", a1, a2);//产生:"ABCDEFGHIJKLMN"

这可以类比打印浮点数的”%m.nf”,在”%m.ns”中,m 表示占用宽度(字符串长度不足时补空
格,超出了则按照实际宽度打印),n 才表示从相应的字符串中最多取用的字符数。通常在打印字
符串时m 没什么大用,还是点号后面的n 用的多。自然,也可以前后都只取部分字符:

sprintf(s, "%-*d", 4, 'A'); //产生"65 "
sprintf(s, "%#0*X", 8, 128); //产生"0X000080","#"产生0X
sprintf(s, "%*.*f", 10, 2, 3.1415926); //产生" 3.14"

1,printf就是标准输出,在屏幕上打印出一段字符串来。

2,sprintf就是把格式化的数据写入到某个字符串中。返回值字符串的长度。

3,fprintf是用于文件操作。

fprintf()中的 stderr说明

先看一个小例子:

#include <stdio.h>

void main()
{
fprintf(stderr,"can't open it!");
fprintf(stdout,"can't open it !");
printf("can't open it!");
}

上面程序编译成fprint文件,运行显示如下:

Can't open it! Can't open it! Can't open it!

若将输入重定向到一个temp.txt文件中,运行:./fprint >temp.txt 结果如下:
Can’t open it!
查看temp.txt文件内容为:
Can’t open it!Can’t open it!

说明:
stdout – 标准输出设备 (printf(“..”)) 同 stdout。
stderr – 标准错误输出设备
两者默认向屏幕输出。

但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。

strerr是作为程序运行过程中的错误显示出来的,若想将它重写向到某文件中,需要运行如下命令:
./fprint 2>temp.txt
这样运行结果就为:
Can’t open it!Can’t open it!
查看temp.txt文件的内容是:
Can’t open it!

stdin

stdin – 标准输入设备.
用法:
char s[80];
fputs(fgets(s,80,stdin);

问题:下面程序的输出是什么?(intel笔试2011)

int main(){
fprintf(stdout,"Hello ");
fprintf(stderr,"World!");
return0;
}

解答:这段代码的输出是什么呢?你可以快速的将代码敲入你电脑上(当然,拷贝更快),然后发现输出是

World!Hello

这是为什么呢?在默认情况下,stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲的,会直接输出,举例来说就是printf(stdout, “xxxx”) 和 printf(stdout, “xxxx\n”),前者会憋住,直到遇到新行才会一起输出。而printf(stderr, “xxxxx”),不管有么有\n,都输出。

2,

fprintf(stderr, "Can't open it!\n"); 
fprintf(stdout, "Can't open it!\n"); 
printf("Can't open it!\n");

这3句效果不是一样啊,有什么区别吗?

有区别。
stdout – 标准输出设备 (printf(“..”)) 同 stdout。
stderr – 标准错误输出设备
两者默认向屏幕输出。
但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。

例如:
my.exe
Can’t open it!
Can’t open it!
Can’t open it!

转向标准输出到磁盘文件tmp.txt
my.exe > tmp.txt
Can’t open it!

用TYPE 看 tmp.txt的内容:
TYPE tmp.txt
Can’t open it!
Can’t open it!


标签:输出,函数,stdout,char,fprintf,sprintf,运用,open
From: https://blog.51cto.com/u_16147764/6397228

相关文章

  • 通义千问预体验,如何让 AI 模型应用“奔跑”在函数计算上?
    立即体验基于函数计算部署通义千问预体验:https://developer.aliyun.com/topic/aigc_fcAIGC浪潮已来,从文字生成到图片生成,AIGC的创造力让人惊叹,更多人开始探索如何使用AI提高生产效率,激发更多创作潜能,然而在实际应用中,AI技术的高门槛仍然让很多人望而却步,普通开发者或者没有......
  • 补充 : 函数之装饰器详解
    函数之装饰器详解装饰器的用途就是为了在不改变原来代码的前提下,将新的功能和函数加入进去【一】简单版本的装饰器#-*-coding:Utf-8-*-#@File:装饰器详解.py#author:Chimengmeng#blog_url:https://www.cnblogs.com/dream-ze/#Time:2023/5/20importtime......
  • mysql聚合函数---总体聚合、总体累加、分组聚合、分组累加
    MySQL从版本8.0开始,才支持窗口函数,所以之前的版本分组累加需要构造sql语句来实现。数据:select*fromemp;一、mysql总体聚合函数min()、max()、count()、sum()、avg()selectcount(ename),max(sal),min(sal),sum(sal),round(avg(sal),2)fromemp;二、mysql总体累加/总体累计数量......
  • 去往js函数式编程(5)
    日志记录  我们可以写一个高阶函数,它以两个函数作为参数,并允许第一个函数只能执行一次,从那一点开始调用第二个函数。constonceAndAfter=(f,g)=>{lettoCall=freturn(...args)=>{letresult=toCall(...args)toCall=greturnresult}}......
  • 支持向量机(含具体推导、核函数)
    参考了西瓜书,《机器学习》周志华背景在超平面(比如三维立体,甚至更高维)上,找到一个分类面\[\boldsymbol{w}^T\boldsymbol{x}+b=0\]看起来很陌生,其实直线方程和\(Ax+By+C=0\)一个道理,只不过拓展到了高维,另外注意这里的\(\boldsymbol{x}\)是指一个高维变量使得分......
  • slice()函数创建一个slice对象
    slice()函数创建一个slice对象,该对象可用于对字符串,列表,元组等进行切片。slice对象用于切片给定的序列(字符串,字节,元组,列表或范围)或任何支持序列协议的对象(实现__getitem__()和__len__()方法)。slice语法:classslice(stop)classslice(start,stop[,step])my_slice=slice(5)......
  • 高阶函数处理字符串方法
    1、concat()用于将一个或多个字符串拼接成一个新字符串。来看下面的例子:letstringValue="hello";letresult=stringValue.concat("world");//可接收任意多个参数letres=stringValue.concat("world","!!");console.log(result);//"helloworl......
  • z函数|exkmp|拓展kmp 笔记+图解
    题外话,我找个什么时间把kmp也加一下图解z函数|exkmp别担心这个exkmp和kmp没毛点关系,请放心食用。本文下标以1开始,为什么?因为1开始就不需要进行长度和下标的转换,长度即下标。定义给出模板串S和子串T,长度分别为n和m,对于每个ans[i](1<=i<=n),求出S[i...n]与T的最长公共前缀长......
  • SQL改写案例6(开窗函数取中位数案例)
    周总找我问个报表SQL实现逻辑的案例,废话不说给他看看。 原SQL:SELECTd.tname姓名,d.spname岗位,d.sum_cnt报单单量,d.min_cnt放款单量,d.date月份FROM(SELECT*FROM(SELECTa.zts_name......
  • java中函数式编程的一些测试
    目录Java中函数式编程的一些测试树反转数据处理科里化Optional函数组合全部代码Java中函数式编程的一些测试在上一篇文章中,提及了java中的函数式编程,但缺少了一些相关的代码,这里补充一下.注意,本文中的代码并不代表最佳实践,只是提供一种思路,其中有很多代码并没有实......