请教peek()与eof()的用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教peek()与eof()的用法相关的知识,希望对你有一定的参考价值。
#include<iostream.h>
#include<fstream.h>
#include<istream.h>
#include<stdio.h>
main()
char ch[3];
ifstream fin( "temp.txt" );
while( fin.peek()!=EOF )
fin >> ch;
cout << ch;
fin.close();
temp.txt里面的是
aa
bb
cc
为什么输出的是
aa
bb
cc
cc
哦,那个cout<<ch应改为cout<<ch<<endl;
读回的不是EOF,则存在读缓冲器里
rdbuf()->sgetc()
while( fin.peek()!=EOF )
如果temp.txt有4行,第4行有新行符号没别的东西,
则循环4次,遇到 EOF 退出
第4次 读缓冲器里的内容是第三次读入的
所以 多一个 cc
eof 是文件结束符号, 编码是 ffff
temp.txt
aa
bb
ccEOF
--------------
与
aa
bb
cc
EOF
----------
前者3行,后者4行
改为:
while( fin.peek()!=EOF )
ch[0] = '\0';
fin >> ch;
cout << ch;
就好了。 参考技术A
peek调用形式为cin.peek() 其返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)
例如
#include <iostream>using namespace std;
int main ()
char c;
int n;
char str[256];
cout << "Enter a number or a word: ";
c=cin.peek();
if ( (c >= '0') && (c <= '9') )
cin >> n;
cout << "You have entered number " << n << endl;
else
cin >> str;
cout << " You have entered word " << str << endl;
return 0;
(以上参考资料为百度百科peek函数)
易于理解其用法
C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
例如:
#include <stdio.h>int main(void)
int n,i;
int array[25];
while (scanf("%d",&n),n!=EOF) //while(scanf("%d",&n)!=EOF)
for (i=0; i<n; i++)
scanf("%d",array+i);
for (i=0; i<n; i++)
printf ("%d ",array[i]);
return 0;
(以上参考资料为百度百科eof)
不懂情追问。
相关函数feof等
Linux中EOF用法
在平时的运维工作中,我们经常会碰到这样一个场景:
执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!
这个时候,就可以使用EOF结合cat命令进行行内容的追加了。
下面就对EOF的用法进行梳理:
EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.
EOF一般会配合cat能够多行文本输出.
其用法如下:
<<EOF //开始
....
EOF //结束
还可以自定义,比如自定义:
<<BBB //开始
....
BBB //结束
通过cat配合重定向能够生成文件并追加操作,在它之前先熟悉几个特殊符号:
< :输入重定向
> :输出重定向
>> :输出重定向,进行追加,不会覆盖之前内容
<< :标准输入来自命令行的一对分隔号的中间内容.
下面通过具体实例来感受下EOF用法的妙处:
1)向文件test.sh里输入内容。
[root@slave-server opt]# cat << EOF >test.sh
> 123123123
> 3452354345
> asdfasdfs
> EOF
[root@slave-server opt]# cat test.sh
123123123
3452354345
asdfasdfs
追加内容
[root@slave-server opt]# cat << EOF >>test.sh
> 7777
> 8888
> EOF
[root@slave-server opt]# cat test.sh
123123123
3452354345
asdfasdfs
7777
8888
覆盖
[root@slave-server opt]# cat << EOF >test.sh
> 55555
> EOF
[root@slave-server opt]# cat test.sh
55555
2)自定义EOF,比如自定义为wang
[root@slave-server opt]# cat << wang > haha.txt
> ggggggg
> 4444444
> 6666666
> wang
[root@slave-server opt]# cat haha.txt
ggggggg
4444444
6666666
3)可以编写脚本,向一个文件输入多行内容
[root@slave-server opt]# touch /usr/local/mysql/my.cnf //文件不提前创建也行,如果不存在,EOF命令中也会自动创建
[root@slave-server opt]# vim test.sh
#!/bin/bash
cat > /usr/local/mysql/my.cnf << EOF //或者cat << EOF > /usr/local/mysql/my.cnf
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
EOF
[root@slave-server opt]# sh test.sh //执行上面脚本
[root@slave-server opt]# cat /usr/local/mysql/my.cnf //检查脚本中的EOF是否写入成功
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
[mysqld]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
basedir = /usr/local/mysql/
datadir = /data/mysql/data
pid-file = /data/mysql/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
sync_binlog=1
log_bin = mysql-bin
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port = 3306
-------------------------------------------------------------------------------------------
下面分享一个自动新建分区并挂载的脚本:
[root@es-node1 ~]# cat auto_add_disk.sh #!/bin/bash fdisk /dev/sdb <<EOF n p 1 wq EOF /sbin/mkfs.ext4 /dev/sdb1 && /bin/mkdir -p /data && /bin/mount /dev/sdb1 /data echo \'LABEL=data_disk /data ext4 defaults 0 2\' >> /etc/fstab
转载自:https://www.cnblogs.com/kevingrace/p/6257490.html
以上是关于请教peek()与eof()的用法的主要内容,如果未能解决你的问题,请参考以下文章
c语言中(c=getchar())!=EOF与c=getchar()!=EOF的区别?