请教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;

fin.peek() 每次读一个元素进来
读回的不是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()的用法的主要内容,如果未能解决你的问题,请参考以下文章

请教关于JSONObject的用法

c语言中(c=getchar())!=EOF与c=getchar()!=EOF的区别?

Linux中EOF用法

EOF的意义及用法(while(scanf(“%d“,&n) != EOF))

chars eof啥用

请教这是啥用法