c 从dat文件读取信息并存储到数组中_C++输入、输出和文件

微信公众号:[奥特曼不打怪兽]👆 记录程序员之旅的点点滴滴。如果你觉得有什么问题或建议,请在公众号留言。

输入和输出概述标准输出流输出和指针刷新输出缓冲区修改计数系统输出流中的函数cout.self和cout.precesion和cout.unself标准输入流cin和缓冲区cin检查输入流状态cin.ignore()和cin.getline()cin.ignore()cin.getline()合作其他输出流标准错误流cerr标准日志流clog文件的输入和输出打开文件文件输入输出流程参考来源

输入和输出概述

•C和C++都没有把输入和输出建立在语言中,即没有关键字是直接输出和输入•C++ 标准库提供了一组丰富的输入/输出功能•C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。•使用缓冲区可以更高效的处理输入和输出。缓冲区是用作中介的内存块,作为信息的临时存储工具。因为程序通常只能处理一个字节,而磁盘驱动器这样的设备是以512字节为单位来工作的。•输入输出类的派生

6d7b69602360f58f47fd9e593649109e.png

标准输出流

输出和指针

•ostream类为以下指针类型定义了插入运算符函数•const signed char*•const unsigned char*•const char*•void*

//代码演示#include  using   namespace   std;int main(){    char name[20] = "zhanyi";    const char* lastname = "guan";    cout << name << endl;//输出:zhanyi    cout << lastname << endl;//输出:guan}

刷新输出缓冲区

•如果程序使用cout将字节发送给标准输出,情况将如何?由于ostream类对cout 对象处理的输出进行缓冲,所以输出不会立即发送到目标地址,而是被存储在缓冲区中,直到缓冲区填满。然后,程序将刷新(flush) 缓冲区,把内容发送出去,并清空缓冲区,以存储新的数据。•但是我们可以主动的刷新缓冲区。比如将换行符发送到缓冲区后,将刷新缓冲区。输入即将发生时也会刷新缓冲区,还可以使用控制符flush来刷新。•但是一般情况下,不加endl大多数情况下,也能正常输出,是因为在系统较为空闲时候,会查看缓存区的内容,如果发现新的内容,便进行输出。

修改计数系统

可以通过iostream中定义的操作符来改变技术系统,比如

cout<<hex;//接下来的输出都是以十六进制输出

更多iostream中定义的操作符见[1]

输出流中的函数

cout<<setiosflags(ios::left|ios::showpoint);  // 设左对齐,以一般实数方式显示cout.precision(5);       // 设置除小数点外有五位有效数字 cout.width(10);          // 设置显示域宽10 cout.fill('*');          // 在显示区域空白处用*填充cout<<resetiosflags(ios::left);  // 清除状态左对齐cout<<setiosflags(ios::right);   // 设置右对齐

更多输出流函数详见[2]

cout.self和cout.precesion和cout.unself

•cout.setf 跟 setiosflags 一样,cout.precision 跟 setprecision 一样,cout.unsetf 跟 resetiosflags 一样。

标准输入流

•cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。

cin和缓冲区

•在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin检查输入

cin检查输入时将跳过空白(空格,换行符和制表符),直到遇到非空白字符。即使对于单字符模式(参数类型为char、unsigned char或signed char),•在单字符模式下,>>运算符将读取该字符,把它放置到指定的位置。在其他模式下,>>运算符将读取一个指定类型的数据。也就是说,它读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。

char str[20];int i;char c;cin>>str>>i>>c;

323e07b12ca33ab13e65f5977fa3dda9.png

流状态

君问归期未有期,巴山夜雨涨秋池

cin.ignore()和cin.getline()

cin.ignore()

•从输入流 (cin) 中提取字符,提取的字符被忽略 (ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到 n 或者被抛弃的字符是 a,则 cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数 \n 起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

//cin.ignore()std::istream::ignoreistream& ignore (streamsize n = 1, int delim = EOF);//EOF:end of file
cin.getline()
//cin.gteline()//通常用来输入包含空格的字符串,遇到换行符则结束std::istream::getlineistream& getline (char* s, streamsize n );//s:输入流向;n:读取个数istream& getline (char* s, streamsize n, char delim );//delim:遇之则结束
合作
#includeusing   namespace   std;  int main()  {      char   str1[30],str2[30],str3[30];      cout   <<   "请输入你的姓名:";      cin>>str1;      cout<<"请输入你的住址:";      //getline()前面必须有cin.ignore();,因为不知道cin缓冲区中是否有'\n'    cin.ignore();      cin.getline(str2,30,'a');      cout   <<   "请输入你的籍贯:";      cin.ignore();      //如果在地址那里输入 bcdabcd 那么此时流里面剩的是 bcd\n,    //此时 cin.ignore(); 吃掉的就是b了,    //这时流里还剩下 cd\n 直接交给 cin.getline(str3,30);     //因为有个 \n 所以这里 getline 就直接返回。    //所以在getline前面正确的ignore()参数应该是:    //cin.ignore(1024,'\n')    cin.getline(str3,30);      cout<}

其他输出流

标准错误流cerr

•预定义的对象 cerr 是 iostream 类的一个实例。cerr 对象附属到标准错误设备,通常也是显示屏,但是 cerr 对象是非缓冲的,且每个流插入到 cerr 都会立即输出。•代码示例

#include using namespace std;int main( ){   char str[] = "Unable to read....";   cerr << "Error message : " << str << endl;}

标准日志流clog

•预定义的对象 clog 是 iostream 类的一个实例。clog 对象附属到标准错误设备,通常也是显示屏,但是 clog 对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出。•代码示例

#include using namespace std;int main( ){   char str[] = "Unable to read....";   clog << "Error message : " << str << endl;}

文件的输入和输出

打开文件

•在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。•下面是 open() 函数的标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void open(const char *filename, ios::openmode mode);

•打开模式

模式标志描述
ios::app追加模式,所有写入都追加到文件末尾
ios::ate文件打开后定位到文件末尾
ios::in打开文件用于读取
ios::out打开文件用于写入
ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。

文件输入输出流程

#include #include using namespace std;int main (){   char data[100];   //声明文件流,以写模式打开文件   ofstream outfile;   outfile.open("afile.dat");   cin.getline(data, 100);   // 向文件写入用户输入的数据   outfile << data << endl;   // 关闭打开的文件   outfile.close();   // 声明文件流,以读模式打开文件   ifstream infile;    infile.open("afile.dat");     //读数据   infile >> data;    // 关闭打开的文件   infile.close();}

参考来源

C++中cin的详细用法[3] C++ 基本的输入输出[4] C++ 文件和流[5]

References

[1] 更多iostream中定义的操作符见: https://www.runoob.com/cplusplus/cpp-basic-input-output.html[2] 更多输出流函数详见: https://www.runoob.com/cplusplus/cpp-basic-input-output.html[3] C++中cin的详细用法: https://blog.csdn.net/bravedence/article/details/77282039[4] C++ 基本的输入输出: https://www.runoob.com/cplusplus/cpp-basic-input-output.html[5] C++ 文件和流: https://www.runoob.com/cplusplus/cpp-files-streams.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值