-
2019-06-12 20:10:16
输入函数:
scanf()、getchar()、gets()、fgets()
输出函数:
printf()、putchar()、puts();
函数详解:
putchar()函数和printf()puts()函数比较简单在这里不再赘述;
getchar()函数:没有参数,是从输入缓冲区中读出一个字符;
scanf(“格式控制字符串”,变量地址)
工作原理:
1、从输入缓冲区中按照scanf函数的第一个参数所规定的格式进行读取符合格式的数据放到对应的变量中;(所以这就是为什么我们书中要求输入数据时一定要按照第一个参数的形式输入,否则会因格式不符合而无法读取数据,因此可以通过scanf函数的返回值来判断用户输入的合法性,而对于scanf函数的返回值,读者自行打印出来观察或者直接看scanf函数的原型。
2、scanf函数会将空格、回车、制表符等空白字符当作数据输入的结束标志,因此scanf函数不能够输入带空格的字符串,因此会用下面的gets函数代替。但是scanf和gets两者都有一个问题就是当数组长度固定时,不能够检测到数组的结束地址,所以会产生数据泄漏的问题,针对这个问题会使用fgets函数代替。
gets(数组首地址)
工作原理:
gets函数经常用在带空格的字符串的输入,不像scanf函数,gets函数会将回车看作为数据输入结束的标志,同时会将回车符从输入流中读出,但不作为字符串的一部分;
fgets(数组首地址,sizeof(数组名),stdin)
工作原理:
从输入流中读出数组大小的数据;防止了数据的泄漏;
当输入字符时需要注意的问题:
当我们输入了一个数据之后,就会习惯性的通过空格或者回车作为数据输入的结束,当我们再次输入一个字符时就需要注意还在输入缓冲区的空格或回车字符,就将会被错误的读到你的字符变量中,导致程序运行时出错
解决办法:将这个所谓无效的字符从输入缓冲区中清除,在输入一个字符前,调用一次getchar()函数,另外就是在scanf(“ %c”);在%前面加个空格
更多相关内容 -
一文搞懂Linux下的文件的标准输入、标准输出、输出重定向问题
2021-11-11 21:32:23我们通常将键盘叫做标准输入设备、将显示器叫做标准输出设备,下面由几个例子来解释文件的标准输入、标准输出、输出重定向。 一、命令行下的标准输入、标准输出、输出重定向 在命令行中可以使用echo命令将想输的...Linux下一切皆文件,所谓的终端那个黑框也可以视为一个文件,在Linux驱动开发中各个设备也可以被认为是文件操作,所以文件的操作很重要。我们通常将键盘叫做标准输入设备、将显示器叫做标准输出设备,下面由几个例子来解释文件的标准输入、标准输出、输出重定向。
一、命令行下的标准输入、标准输出、输出重定向
在命令行中可以使用echo命令将想输的字符串输出在终端上,结果如下:
lzn@ubuntu:~$ echo abcdefdg abcdefdg
这就是标准输出。
在终端中可以使用cat命令来展示标准输入,cat命令后加文件,会在终端展示文件内容,如果不加文件,则你从键盘输入什么消息,他就会在终端展示什么消息,结果如下:
lzn@ubuntu:~$ cat abc 这里是文件的内容 lzn@ubuntu:~$ cat 现在是键盘输入的内容 现在是键盘输入的内容 只有使用Ctrl+C才可以退出回到命令行 只有使用Ctrl+C才可以退出回到命令行 ^C lzn@ubuntu:~$
这里展示的是标准输入,其实也包含了标准输出,因为也是在终端显示的信息。cat abc是查看abc文件的内容。
重定向多用于输出重定向,所以下面只在终端做输出重定向的例子,输出重定向用>,>>,2>。输入重定向号用符号<表示,<表示输出重定向并覆盖以前的数据,<<表示输出重定向追加在以前的数据后。2>表示错误输出,最后还是会把数据输出在终端上即输出在标准输出设备上。下面是例子(test是我的测试文件):
lzn@ubuntu:~$ echo abcd abcd lzn@ubuntu:~$ echo abcd > test lzn@ubuntu:~$ cat test abcd lzn@ubuntu:~$ echo efgh > test lzn@ubuntu:~$ cat test efgh lzn@ubuntu:~$ echo abcd >> test lzn@ubuntu:~$ cat test efgh abcd lzn@ubuntu:~$ echo aaaaaaaa 2> test aaaaaaaa lzn@ubuntu:~$ cat test 注意:错误输出虽然不会输出在test文件里,但是还是会清空test文件,还有2>>重定向就不演示了。
以上内容就是命令行中标准输入、输出、重定向的用法。
二、文件操作中的标准输入、输出、重定向用法
每一个文件都有自己的文件描述符,系统会将0、1、2分配给标准输入、标准输出、错误输出。所以我们打开的文件名是从3开始的。当然我们也可以将文件描述符改为0、1、2,这里就不说了。
下面根据代码来展示标准输入输出、重定向的用法。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define BUFFMAX 32 int main(int argc,char **argv) //argc表示执行文件后的参数数量,argv[]表示后面参数代表的 文件,argv[0]代表本段代码的文件名 { if(argc<2) { perror("少于1个文件!\n"); exit(1); } int fd0; if((fd0=open(argv[1],O_RDONLY))<0) //打开文件并判断文件是否正确打开 { perror("open error\n"); exit(1); } int len; char buf[BUFFMAX]; while(1) { len=read(fd0,buf,BUFFMAX); //read和write都是简单的函数,不懂可以去搜 if(len>0) { write(1,buf,len); //这里1表示标准输出,就是将数据显示在终端上 } if(len==0) break; } close(fd0); exit(0); }
以上代码功能就是将文件的内容标准输出,当然输出的文件就是屏幕即终端界面,运行结果如下:
lzn@ubuntu:~$ ./a a.c //执行a.c的代码来输出a.c的程序,以下是输出,只截取部分。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define BUFFMAX 32
那如何将输出重定向到其他文件呢,只需要再打开一个文件,将其定向为输出位置,代码如下:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define BUFFMAX 32 int main(int argc,char **argv) { if(argc<2) { perror("少于2个文件!\n"); exit(1); } int fd0,fd1; if((fd0=open(argv[1],O_RDONLY))<0) { perror("open error\n"); exit(1); } if((fd1=open(argv[2],O_WRONLY))<0) { perror("open error\n"); close(fd0); exit(1); } int len; char buf[BUFFMAX]; while(1) { len=read(fd0,buf,BUFFMAX); if(len>0) { write(fd1,buf,len); //把刚才的1换成了另一个文件的文件描述符 } if(len==0) break; } close(fd0); close(fd1); exit(0); }
下面是执行结果:
lzn@ubuntu:~$ vim a.c lzn@ubuntu:~$ gcc -o a a.c lzn@ubuntu:~$ ./a a.c test //执行a.c的代码将a.c程序重定向输出到test文件中。以下只是部分输 出 lzn@ubuntu:~$ cat test #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define BUFFMAX 32 int loop=0;
以上就是文件操作中的标准输入、输出、重定向用法。感兴趣的可以去看看Unix环境高级编程,Linux开发的圣经值得反复读。
-
Linux的标准输入、标准输出和标准错误
2019-03-02 20:20:43Linux的标准输入、标准输出和标准错误 什么是文件描述符? 文件描述符是一个简单的正整数,用以标明每一个被进程所打开的文件和socket。 最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出...Linux的标准输入、标准输出和标准错误
什么是文件描述符?
文件描述符是一个简单的正整数,用以标明每一个被进程所打开的文件和socket。
最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应。Unix/Linux/BSD 都有三个特别文件,分别
1)标准输入 即 STDIN , 在 /dev/stdin ,
一般指键盘输入, shell里代号是 0
2) 标准输出 STDOUT, 在 /dev/stdout,
一般指终端(terminal), 就是显示器, shell里代号是 1
3) 标准错误 STDERR, 在 /dev/stderr
也是指终端(terminal), 不同的是, 错误信息送到这里
shell里代号是 2
2, 3用些例子再表达一下User@User-PC ~ $ ls /dev/stdin /dev/stdin@ User@User-PC ~ $ ls -l /dev/std* lrwxrwxrwx 1 User Users 15 Mar 1 2008 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 User Users 15 Mar 1 2008 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx 1 User Users 15 Mar 1 2008 /dev/stdout -> /proc/self/fd/1
将标准输出导向到文件, ls 1> log1.txt,缩写就是 ls > log1.txtUser@User-PC ~ $ ls 1> log1.txt User@User-PC ~ $ cat log1.txt Mail/ News/ a.txt aa* awkscr b.txt bb* bin/ cc cgitest.rex* dd* irc-sh* junk lib/ log1.txt lynx.cfg matrix/ perlscr* pp* rexx_script/ rrr testawk tmp/ trash
标准错误的演示User@User-PC ~ $ ls llll 1> log2.txt ls: 无法存取 llll: No such file or directory 再次执行,但这次没有这个文件llll, 出现错误讯息 User@User-PC ~ $ cat log2.txt User@User-PC ~ $ file log2.txt log2.txt: empty 输出没有导向到文件,文件是空文件 User@User-PC ~ $ ls llll 2> log2.txt User@User-PC ~ $ cat log2.txt ls: 无法存取 llll: No such file or directory User@User-PC ~ $ 再次执行刚才的命令,只是将 1> log2.txt 改为 2> log2.txt 这次就成功把错误讯息导向至文件了
命令 2>&1 > file, 如
User@User-PC ~ $ echo 123 | if grep -E '[0-9]+' 2>&1 > /dev/null ; then echo "This is number."; fi This is number.
grep 标准输出和标准错误 都导向到系统‘黑洞’,不会再屏幕上显示什麼
最后再解释一下:> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
1.&>file或n>&m均是一个独立的重定向符号,不要分开来理解。
2.明确文件和文件描述符的区别。
3.&>file表示重定向标准输出和错误到文件
例如:
rm -f $(find / -name core) &> /dev/null,/dev/null是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉。
4.n>&m表示使文件描述符n成为输出文件描述符m的副本。这样做的好处是,有的时候你查找文件的时候很容易产生无用的信息,如:2> /dev/null的作用就是不显示标准错误输出;另外当你运行某些命令的时候,出错信息也许很重要,便于你检查是哪出了毛病,如:2>&1
例如:
注意,为了方便理解,必须设置一个环境使得执行grep da *命令会有正常输出和错误输出,然后分别使用下面的命令生成三个文件:grep da * > greplog1 grep da * > greplog2 1>&2 grep da * > greplog3 2>&1 //grep da * 2> greplog4 1>&2 结果一样 #查看greplog1会发现里面只有正常输出内容 #查看greplog2会发现里面什么都没有 #查看greplog3会发现里面既有正常输出内容又有错误输出内容
-
标准输入和标准输出的read_write
2017-03-20 15:59:46标准输入和标准输出的read_write在/usr/include/unistd.h中有如下定义: /* Standard file descriptors. */ #define STDIN_FILENO 0 /* Standard input. */ #define STDOUT_FILENO 1 /* Standard output. */ #define STDERR_FILENO 2 /* Standard error output. */
#include <stdio.h> #include <string.h> /*客户端的处理过程*/ void process_conn_client(int s) { ssize_t size = 0; char buffer[1024]; /*数据的缓冲区*/ for (;;) { /*循环处理过程*/ /*从标准输入中读取数据放到缓冲区buffer中*/ size = read(0, buffer, 1024); if (size > 0) { /*读到数据*/ write(s, buffer, size); /*发送给服务器*/ size = read(s, buffer, 1024); /*从服务器读取数据*/ write(1, buffer, size); /*写到标准输出*/ } } } /*服务器对客户端的处理*/ void process_conn_server(int s) { ssize_t size = 0; char buffer[1024]; /*数据的缓冲区*/ for (;;) { /*循环处理过程*/ size = read(s, buffer, 1024); /*从套接字中读取数据放到缓冲区buffer中*/ if (size == 0) { /*没有数据*/ return; } /*构建响应字符,为接收到客户端字节的数量*/ sprintf(buffer, "%d bytes altogether/n", size); write(s, buffer, strlen(buffer) + 1);/*发给客户端*/ } } }
# app > out.log // 这样在代码中write(1, buf, size)就直接写入到文件之中了,无需在代码中操作文件
-
文件IO---标准输入、标准输出和标准错误
2017-11-05 12:46:17文件IO---标准输入、标准输出和标准错误 (1) 每个进程都会默认打开3个文件描述符,即0、1、2。其中0代表标准输入流、1代表标准输出流、2代表标准错误流。通常标准输入流对应着键盘的设备文件、标准输出流和... -
标准输入/输出和重定向
2017-11-05 19:55:40标准输出文件(stdout)和 标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息 送到标准错误文件中。 我们以cat... -
标准输入,标准输出和标准错误
2019-03-19 17:48:04当我们使用文件描述符进行操作时,需要操作标准输入、标准输出、标准错误,可以包含如下头文件: #include <unistd.h> 这个头文件中定义了标准设备: /* Standard file descriptors. */ #define STDIN_FILENO... -
C语言标准输入输出缓冲区
2018-07-08 22:21:05注: 以下实验环境为Ubuntu 18.04LTS(只有64bit),gcc (Ubuntu ...我们以printf函数和stderr为例,先说明stdout(对应printf)是遇到换行符或缓冲区满之后或程序结束后才输出缓冲,stderr一般是无缓冲的: /* ... -
linux中标准输入,标准输出,标准错误输出及管道的使用
2018-01-23 12:20:07比如说你打开命令行的时候,默认情况下,命令行的标准输入连接到键盘,标准输出和标准错误都连接到屏幕。对于一个程序来说,尽管它总会打开这三个流,但它会根据需要使用,并不是一定要使用。 想象一下敲击一个 ... -
详解Python的标准输入输出
2020-12-29 09:42:37本篇文章给大家分享的是详解Python的标准输入输出,内容挺不错的,希望可以帮助到有需要的朋友一、标准输入输出1、打印到屏幕产生输出的最简单方法是使用print语句,可以通过用逗号分隔零个或多个表达式。... -
在Java中使用标准输入输出设备进行字符串,整数浮点数等 的输入输出操作
2016-11-30 23:13:49在Java语言中进行标准输入输出(键盘显示器)需要通过创建输入输出流对象的方式进行,一般情况下我们可以使用 BufferedReader,Scanner(JDK1.5以上)Console(JDK1.6以上)这三个类和Syste... -
Linux 标准输入、标准输出、错误输出
2022-01-27 23:32:181 标准输出 2 标准错误输出 每个进程都会创建一个这样的文件夹。 都是0 代表标准输入。 例子: 下面两个相同 echo “hahahah” >>stdout.out echo “hahahah” 1>>stdout.out lsl >>stderror ... -
linux的标准输入输出
2018-08-29 02:53:26最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误输... -
标准输入输出流(InputStream ,PrintStream )
2020-05-12 20:23:04public static final PrintStream out:标准输出流。通常该流对应于显示输出或者由主机环境或用户指定的另一个输出目标 我们先看标准输入流 package com.testIO; import java.io.IOException; import java... -
Bash中的标准输入、标准输出和标准错误输出
2019-01-14 11:04:511、首先,bash中0,1,2三个数字分别代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。 2、输入输出... -
python 标准输入输出
2019-03-27 11:51:39标准输入输出 能够使用 input 函数通过键盘输入数据到程序中 能够使用print函数完成字符串信息的动态输出打印 能够完成输入输出版计算圆面积的案例 输入 1.1 概念 用户通过控制台将数据传递给程序的过程 1.2 语法... -
JavaSE基础(133) 标准输入输出流以及标准错误输出流的基本使用
2018-09-09 21:18:15标准输入输出流以及标准错误输出流的基本使用: System.out是一个特殊的 PrintStream "标准"输出流==》 输出结果到控制台System.err是一个特殊的 PrintStream "标准"错误输出流==》输出到控制台System.in是一个... -
算法-标准输入和输出
2018-08-07 13:50:31package base.第一章; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; import edu.princeton.cs.algs4.StdRandom; ... * Created by MK on ... * 标准输入和标准输出 */ public clas... -
C++ 标准输入,标准输出,标准错误和标准日志
2019-02-24 22:17:22C++ 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍。本章将讨论 C++ 编程中最基本和最常见的 I/O 操作。 C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络... -
linux中的标准输入输出
2018-09-04 09:56:17标准输出1 输出到屏幕(即控制台) /proc/self/fd/1 错误输出2 输出到屏幕(即控制台) /proc/self/fd/2 /dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞” ... -
Linux C 将标准输入输出重定向到文件的三种方法
2019-10-09 18:43:18当在Linux系统中打开一个文件时,标准输入、标准输出、标准错误输出是默认打开的 指定重定向 文件file_redirect、file_stdout(必须是已经存在的) 为了验证是否实验成功可以事先在文件中写入一句话:Successful ... -
C语言标准输入、输出文件
2020-06-28 23:23:53标准输入文件,一般指键盘;scanf()、getchar() 等函数默认从stdin获取输入。 标准输出文件,一般指显示器;printf()、putchar() 等函数默认向stdout输出数据 下面演示用scanf()输入到stdin再由printf()输出到... -
dup、dup2实现文件描述符重定向(标准输入、标准输出、标准错误输出)
2019-07-06 11:12:01重定向标准输入 重定向标准输出 重定向标准错误输出 重定向恢复 总结 在前文中,可以知道,文件描述符实际上是指向文件表项的指针数组索引,也就相当于每个文件描述符都对应一个文件表项,最终对应一个文件,... -
java的标准输入输出(一)
2015-11-23 15:44:45在C++中,标准的输入输出是使用iostream库,cin为标准输入,cout为标准输出,cerr为输出警告和报告错误消息。clog是用来输出程序运行的一般信息。 //举例 int v1,v2; cin>>v1>>v2; cout 2.java的标准输入和输出 ... -
输入输出设备.ppt
2021-07-28 09:39:21文档介绍:第06章输入/输出设备计算机的输入/输出设备包括鼠标、键盘、打印机和扫描仪等等,其中鼠标和键盘是计算机的标准输入设备,计算机没有它们将无法被用户操作。而打印机和扫描仪等设备则是计算机的常用外置设备... -
C语言标准输入输出重定向
2018-07-13 18:26:01标准输入重定向:freopen("a.txt","r"...#endif在加了这句,本地调试的时候从文件读取输入数据,在线测试的时候还是从标准输入读取输入数据 标准输出重定向:freopen("b.... -
18. Perl 标准输入输出
2019-08-27 16:03:40默认情况下, Perl 程序标准输入为键盘输入, 标准输出为终端显示器. 1. 标准输入 使用 可以获取用户从键盘输入的一行信息, Enter 键结束输入, 输入结果包含换行符 通常会使用chomp函数去掉行尾的换行符, 使用... -
什么是标准输入、标准输出(stdin、stdout)?
2019-06-12 10:49:23原文地址:什么是标准输入、标准输出(stdin、stdout)?...而标准输入和标准输出是干什么的?它们是用于IO的。 那么它们属于IO的哪个部分? 内存?还是外部设备? 答案显然是外部设备(逻辑上的外部设... -
C/C++标准输入输出格式控制
2018-03-21 20:30:091、c语言输入输出格式控制 (1)输入格式控制–scanf() ...scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数. 它和printf()有点类似. format(格式)字符串由控制字符,空白字符和... -
C++中的标准输入和输出
2017-01-03 15:49:05在C语言中我们的输入和输出都是以printf和scanf进行操作的。他们都是函数。在C++中的我们的输入输出都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统(Linux)的角度看,每一个与主机...