c语言中的数据流

stdout, stdin, stderr的中文名字分别是标准输出,标准输入和标准错误。 在Linux下, 当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流 。什么是数据流呢(stream)?我们知道,一个程序要运行,需要有输入、输出,如果出错,还要能表现出自身的错误。这是就要 某个地方读入数据、将数据输出到某个地方,这就够成了数据流。
因此,一个进程初期所拥有的这么三个数 流,就分别是 输出、标准输入和标准错误,分别用stdout, stdin, stderr来表示。对于这三个数据流来说,默认是表现在用户终端上的一般stdout, stderr被定位到屏幕 比如我们在c中使用fprintf: fprintf(stdout,"hello world!n"); 屏幕上将打印出"hello world!"来。 stdin被定位到键盘 。当然他们也可以重新定位。


流的重定向

实现函数:FILE *freopen(const char *filename,const char *type, FILE *stream);此函数一般用于将一个指定的文件打开一个预定义的流:标准输入、标准输出或者标准出错。

这个例子实现了从stdout到一个文本文件的重定向。即,把输出到屏幕的文本输出到一个文本文件中。
#include <stdio.h>
int main()
{
int i;
if (freopen("D:OUTPUT.txt", "w", stdout)==NULL)
fprintf(stderr, "error redirecting\stdout\n");
for(i=0;i<10;i++)
printf("%3d",i);
printf("\n");
fclose(stdout);
return 0;
}
在VC++6.0中运行一下,你会发现,十个数输出到了D盘下文本文件OUTPUT.txt中。


fprintf()函数

int fprintf( FILE *stream, const char *format, ... );
fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. fprintf()只能和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值.


int fseek(FILE *stream, long offset, int fromwhere);fseek 用于二进制方式打开的文件,移动文件读写指针位置.
fseek(in,-1L,1);   -- 文件流in, 零点为当前指针位置,SEEK_CUR 就是 1,  -1L -- 文件指针回退1个字节int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
  SEEK_END: 文件结尾
  其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
  简言之:
  fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
  fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
    fseek(fp,100L,2);把fp指针退回到离文件结尾100字节处。
参考资料:http://hi.baidu.com/yesreallove/blog/item/0bb05516a3420143f2de3213.html
  返回值: 成功,返回0,否则返回其他值。

一个例子:

c语言 分解质因数算法
#include<stdio.h>
#include<math.h>
	int main() {
		int i,b;
		long long in; /*采用64位整型,以便输入更大的数*/
		freopen("F://1.txt","r",stdin);
		freopen("F://2.txt","w",stdout);
		while(scanf("%lld",&in)!=EOF) { /*在F://1.txt中输入x个数N(N>=2)以换行符或空格符隔开,当没有输入时循环会自动结束*/
			b=0; /*用于标记是否是第一个质因数,第一个质因数在输出时前面不需要加空格*/
			for(i=2;in!=1;i++)
				if(in%i==0) {
					in/=i;
					b?printf(" %d",i):printf("%d",i),b=1;
					i--; /*i--和i++使得i的值不变,即能把N含有的所有的当前质因数除尽,例如:24会一直把2除尽再去除3*/
				}
				printf("\n");
		}
		return 0;
}



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值