关于输入输出(stdin、stdout、stderr)

2024-06-15 13:08

本文主要是介绍关于输入输出(stdin、stdout、stderr),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

启动一个C语言程序时,操作系统环境负责打开三个文件,并将这3个文件的指针提供给该程序。这3个文件分别为标准输入(stdin)、标准输出(stdout)、标准错误(stderr)。它们在<stdio.h>中声明,大多数环境中,stdin指向键盘,stdout、stderr指向显示器。之所以使用stderr,若因某种原因造成其中一个文件无法访问,相应的诊断信息要在该链接的输出的末尾才能打印出来。当输出到屏幕时,这种处理方法尚可接受,但如果输出到一个文件或通过管道输出到另一个程序时,就无法接受了。若有stderr存在,即使对标准输出进行了重定向,写到stderr中的输出通常也会显示在屏幕上。

exit():在主程序main中,语句return expr等价于exit(expr)。但是,函数exit有一个优点,它可以从其他函数中调用,并且可以用查找程序查找这些调用。exit(0)为正常退出,exit(1)只要里面的参数不为零,为非正常退出,。

fgets:

char *fgets(char *line, int maxline, FILE *fp);

 fp指向的文件中读取下一个输入行(包括换行符),并将它存放在字符数组line中,最多读取maxline-1个字符。读取的行将以'\0'结尾,结尾保存到数组中。通常,fgets返回line,遇到文件结尾或发生错误,返回NULL。

 

晚上做了一个题,用去了很长时间,就因为一些简单错误,在此记录。《C程序设计语言》第2版(中文)P145 7-6:

编写一个程序,比较两个文件并打印它们第一个不相同的行。

 1 #include <stdio.h>
 2 
 3 #define MAXSIZE 100
 4 
 5 main(int argc, char *argv[])
 6 {
 7     FILE *fp1, *fp2;
 8     void filecmp(FILE *, FILE *);
 9     char *prog = argv[0];
10 
11     if (argc < 3) {
12     fprintf(stderr, "error: no enough files!\n");
13     exit(1);
14     }
15     else {
16     if ((fp1 = fopen(*++argv, "r")) == NULL) {
17         fprintf(stderr, "%s: can't open %s\n", prog, *argv);
18         exit(2);
19     }
20     else if ((fp2 = fopen(*++argv, "r")) == NULL) {
21         fprintf(stderr, "%s: can't open %s\n", prog, *argv);       
22         exit(3);
23      }
24     else {       
25         filecmp(fp1, fp2);
26         fclose(fp1); 
27         fclose(fp2); 
28     }
29     }
30     exit(0);
31 }
32 
33 void filecmp(FILE *ifp1, FILE *ifp2)
34 {
35     char line1[MAXSIZE], line2[MAXSIZE];
36 
37     int count = 0;
38     int full = 0;
39 
40     while ((fgets(line1, MAXSIZE, ifp1) != NULL) &&
41          (fgets(line2, MAXSIZE, ifp2) != NULL)) {
42         if ((strcmp(line1, line2)) == 0) {
43         count++;
44         full = 1;
45      }
46     else {
47         fprintf(stdout, "The number of different line is %d\n", count);
48         fprintf(stdout, "%s\n", line1);   
49         fprintf(stdout, "%s\n", line2);  
50         return; 
51        }
52     }
53     if (!full)
54     fprintf(stderr, "error: cannont read!\n");
55     else 
56     fprintf(stderr, "same files!\n");
57 }

错误1:将第35行写为:

char *line1, *line2;

这里明显混淆了数组与指针的关系,若为当做数组,实际是第一个数的地址,而不是整个数组。

错误2:第42行后,加了两句:

fp1++;
fp2++;

fp1、fp2实际是指向文件的文件描述符,不能做加减运算。按照我的本意是fp1自加后指向文件的下一行,实际上fgets函数读取下一行时已经加上换行符了。

fgets函数如下:

 1 char *fgets(char *s, int n, FILE *fp)
 2 {
 3     register int c;
 4     register char *cs;
 5 
 6     while (--n > 0 && (c = getc(iop)) != EOF)
 7     if ((*cs++ = c) == '\n')
 8         break;
 9     *cs = '\0';
10     return (c == EOF && cs == s) ? NUll : s;
11 }

第7行写的很清楚,读了换行符。

总结经验:要先弄清函数各个参数的用法再动手,否则事倍功半。

这篇关于关于输入输出(stdin、stdout、stderr)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063536

相关文章

HDU1720(输入输出涨姿势)

A+B Coming Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5953    Accepted Submission(s): 3901 题目链接: http://acm.hdu.edu.cn/showproblem.p

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

Java中的输入输出方法及格式

输入 通过Scanner类的对象进行输入 Scanner类位于java.util.Scanner包中,需要使用import关键字导入 Import java.util.Scanner 首先创建一个Scanner类的对象 Scanner 对象名=new Scanner(System.in); Scanner类中提供的方法包括 next():获取字符串,但不包括空格、Tab键和换行符

【C++】C++的输入输出、循环、条件、字符串、数组、类、继承的使用实例

本文介绍C++的基本使用,用一个程序说明的基本运用,当然C++中的指针与运算符的重载这些特色东西还没有涉及,只是把编程中最基本的东西讲述一次, 与《【Python】Windows版本的python开发环境的配置,Helloworld,Python中文问题,输入输出、条件、循环、数组、类》(点击打开链接)是姊妹篇,据说这堆东西出书的话能写很多很多页,上课的话能上大半学期,真是醉了。 以下程

输入输出系统和中断总结

IO系统基本概念 外部设备:包括输入输出设备以及通过输入输出接口才能访问的外存储设备接口:在各个外设与主机之间传输数据时进行各种协调工作的逻辑部件输入设备:用于向计算机系统输入命令和文本、数据等信息的部件输出设备:用于将计算机系统中的信息输出到计算机外部进行显示、交换等部件外存设备:除计算机内存及CPU缓存外的存储器 IO系统分为IO软件和IO硬件 软件:采用IO指令和通道指令实现CPU和IO

集成电路学习:什么是I/O输入输出

I/O:输入输出         I/O,全称Input/Output,即输入输出,是信息处理系统(如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信方式。具体来说,输入是系统接收的信号或数据,而输出则是系统从其发送的信号或数据。         在计算机系统中,I/O操作涉及数据在内部存储器和外部存储器或其他周边设备之间的传输。这些设备包括但不限于键盘、鼠标(输入设备),以及

计组-第七章(输入输出系统)

中断隐指令有硬件实现       中断 涉及CPU处理

集成电路学习:什么是GPIO通用输入输出

GPIO:通用输入输出         GPIO,全称General Purpose Input/Output,即通用输入/输出端口,是嵌入式系统中非常重要的基本硬件资源之一。以下是对GPIO的详细解析: 一、GPIO的定义与功能         GPIO是一种非常灵活的接口,可以实现数字输入、数字输出、模拟输入、模拟输出等多种功能。它作为微控制器、嵌入式系统或其他电子设备与外部世界进行

c 基本类型-输入输出函数:

#include<stdio.h>#include<stdlib.h> main() { /*c语言中类型c 长度 面为 java 中长度 int 类型的长度:4 char 类型的长度:1 2float 类型的长度:4double 类型的长度:8long 类型的长度:4 8short 类型的长度:2signed 类型的长度:4unsigned 类型的长度:4c语言中没有

TI DSP TMS320F280025 Note9:GPIO输入输出与外部中断功能原理与应用

TMS320F280025 GPIO输入输出与外部中断功能原理与应用 文章目录 TMS320F280025 GPIO输入输出与外部中断功能原理与应用GPIO原理输入输出模式的共同特性1. 复用设置2. 内部上拉设置3. GPIO状态读取 对于输出模式输出电平设置开漏输出设置 对于输入模式极性设置采样类型不同步(异步输入)只同步到SYSCLKOUT使用采样窗口进行鉴定 外部输入中断G