重庆网站建设优化wordpress企业主题 视频

当前位置: 首页 > news >正文

重庆网站建设优化,wordpress企业主题 视频,东莞网上推广,wordpress和帝国哪个好Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏#xff1a; 与C的邂逅 本篇博客我们来了解C中io流的相关知识。 #x1f3e0; C语言输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 sc… Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页:        9ilk (๑•́ ₃ •̀๑) 文章专栏     与C的邂逅   本篇博客我们来了解C中io流的相关知识。 C语言输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。如下图所示 对输入输出缓冲区的理解 :

  1. 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分差异,可以很容易写出可移植的程序。
  2. 可以使用这部分的内容实现行读取的行为对于计算机而言是没有“行这个概念的有了这部分就可以定义”行的概念然后解析缓冲区的内容返回一个“行。 流是什么 流”即是流动的意思是物质从一处向另一处流动的过程是对一种有序连续且具有方向性的数据 其单位可以是bit,byte,packet 的抽象描述。 C流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为流。 C流的特性 : 有序连续,具有方向性。 为了实现这种流动C定义了I/O标准类库这些每个类都称为流/流类用以完成某方面的功能。 CIO流 C系统实现了一个庞大的类库其中ios为基类其他类都是直接或间接派生自ios类。 C标准IO流 C标准库提供了4个全局流对象cin,cout,cerr,clog:
  3. cout : 用来进行标准输出,即数据从内存流向控制台(显示器)。
  4. cin : 用来进行标准输入即数据通过键盘输入到程序中
  5. cerr : 用来进行标准错误的输出。
  6. clog : 用来进行日志的输出。 cout 1111 endl; //1111 cerr 1111 endl; //1111 clog 1111 endl; //1111 注 1. cout,cerr,clog是ostream类的三个不同对象这三个对象基本用法没有什么区别只是应用场景不同。 2. 使用这4个全局流对象必须包含头文件iostream并引入std标准空间。 cin为缓冲流。键盘输入的数据保存在缓冲区中当要提取时是从缓冲区中拿。如果一次输入过多会留在那儿慢慢用如果输入错了必须在回车之前修改如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完之后才要求输入新的数据。 int a 0, b 0; cin a; //输入10 20 cout a endl; cin b; //直接从输入缓冲区提取 cout b endl; 空格和回车都可以作为数据之间的分隔符所以多个数据可以在一行输入也可以分行输入。但如果是字符型和字符串则空格(ASCII码为32)无法用cin输入字符串中也不可能有空格。回车符也无法读入。 string s; cin s; //输入hello world cout s endl; //输出hello 对于含有空格的字符串我们需要使用getline函数进行读取因为getline函数只有遇到’\n’才会停止读取。 string s; getline(cin, s); //输入hello world cout s endl; //输出hello world cin和cout可以直接输入和输出内置类型数据原因标准库已经将所有内置类型的输入和输出全部重载了。 运算符 运算符: 对于自定义类型如果需要支持cin和cout的标准输入输出需要对和进行重载。在线OJ中的输入和输出 对于IO类型的算法一般都需要循环输入输出时应该严格按照题目要求进行多一个少一个空格都不行连续输入时vs系列编译器下在输入ctrlz时结束。 // 单个元素循环输入 while(cina) { // … } // 多个元素循环输入 while(cabc) { // … } // 整行接收 while(cinstr) { // … } istream类型对象转换为逻辑条件判断值 string str; while(cin str) {cout str endl; } 对于这段连续输入输出的代码如果我们想结束只需要ctrlz那为什么ctrlz可以结束呢? stream operator (int val); explicit operator bool() const; 实际上我们看到使用while(cin str)去流中提取对象数据时调用的是operator返回值是istream类型的对象但是istream对象是不可以做逻辑条件值的源自于istream的对象又调用了operator bool,operator bool调用时如果接收流失败或者有结束标志则返回false。 while(opertor(cin,str).operator bool()) {cout str endl; } 关于标志 由文档可知 , 当failbit标志或badbit标志都没有被设置之后才返回true否则返回false。那什么是标志呢 由文档可知: 1.eof表示已经达到文件尾。 2.good是表示流状态完全正常没有任何错误。 3.badbit表示输入输出流发生了不可恢复的错误,当这个标志被设置时意味着流的状态已损坏后续的输入输出操作可能无法正常进行。注意这里是可能意思是这个标志被设置后后面继续使用可能会出现问题并不是设置完后流中的内容立即失效或者不可访问。 4.fail表示发生了可恢复的错误比如类型不匹配或格式错误流仍然可以继续使用。 对于ctrlz相当于是设置了failbit标志 我们可以用good(),eof(),fail(),bad()这几个成员函数来帮助我们读取这几个标志的状态。 string str; while(operator(cin,str).operator bool()) {cout cin.good() endl;cout cin.eof() endl;cout cin.bad() endl;cout cin.fail() endl;cout str endl; }cout cin.good() endl;cout cin.eof() endl;cout cin.bad() endl;cout cin.fail() endl;运行结果 311123//输入 1 0 0 0 311123//输出 ^z //ctrl z 0 1 0 1 注我们可以把输入设备和输出设备当作文件此时ctrlz之后流提取结束相当于文件结束所以还把eof标志设置了。 如果想正常提取那就需要只有good标志被设置,否则不能正常流提取;此时我们可以用clear()标志进行。 string str; while(operator(cin,str).operator bool()) {cout cin.good() endl;cout cin.eof() endl;cout cin.bad() endl;cout cin.fail() endl;cout str endl; }cout cin.good() endl; cout cin.eof() endl; cout cin.bad() endl; cout cin.fail() endl;cin.clear(); cin str; 输入的数据类型必须要与提取的数据类型一致否则出错。出错只是在对应流的标志状态设置为1 int i 0; cin i ; cout i endl;cin i; cout i endl;cout cin.good() endl; cout cin.eof() endl; cout cin.bad() endl; cout cin.fail() endl; 11s//输入 11 //第一次打印 0//第二次 注 我们知道我们输入内容都在缓冲区里此时第二次提取遇到字符出错整形无法正确提取i被默认清为0。 int i 0; cin i ; cout i endl;cin i; cout i endl;cin.clear(); cin i; cout cin.good() endl; cout cin.eof() endl; cout cin.bad() endl; cout cin.fail() endl; clear之后 0 0 0 1 为什么clear之后fail标志还是被设置呢那是因为clear只改变标志的状态而字符s还在缓冲区内下次读取还会出错,因此我们需要把缓冲区内的字符拿掉。 正确读取数据的程序: int i 0; cin i ; cout i endl;cin i; cout i endl;cin.clear(); cin i; while (cin.fail()) {cin.clear();cin.get();//不断拿掉字符cin i; } cin和cout的效率问题 在io需求比较高的地方,如部分大量输入的竞赛题中,加上以下3行代码可以提高CIO效率. ios_base::sync_with_stdio(false); cin.tie(nullptr); cout,tie(nullptr); 解释:
  7. 缓冲区本质是提高效率,但是C兼容了C语言的stdio流确保printf打印时数据在缓冲区的刷新,此时两种语言的流就需要保持同步刷新,这需要一些时间代价,第一行代码相当于取消同步刷新. 2.默认cin和cout是绑定的,也就是一个流IO操作时另一个绑定的流也同步刷新,后两行代码相当于取消绑定. C标准文件流 C根据文件的内容的数据格式分为二进制文件和文本文件采用文件流对象操作文件的一般步骤如下 定义一个文件流对象 类对应操作场景ifstream只读ofstream只写fstream可读可写 注:使用文件流对象需要包含对应的头文件fstream 使用文件流对象成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系 打开方式                            功能                                   in                      以读的方式打开文件                                      out                      以写的方式打开文件                               binary                  以二进制的方式打开文件                                  ate                 输出位置从文件的末尾开始                                  app               以追加的方式对文件进行写入                                 trunc                先将文件内容清空再打开文件 类似C语言fopen我的流对象可以使用open这个成员函数进行打开文件,参数一是所要打开的文件,参数二是打开文件的方式。  注 :
  8. 注意这几种不同的打开方式是可以用运算符 | 进行结合的因为在底层这些打开方式的是用一个整数的bit位来存储表示的因此或一下不同mod对应位置都设置为1。 fstream fs; fs.open(data.txt,ofstream::out | ofstream::binary); //两种方式打开2.使用ofstream类对象的open函数时若不指定打开方式则默认以写的方式打开文件 3.使用ifstream类对象的open函数时若不指定打开方式则默认以读的方式打开文件。 4.使用fstream类对象的open函数时若不指定打开方式则默认以写读的方式打开。 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写 成员函数功能put插入一个字符到文件write插入一段字符到文件get从文件提取单个字符 read 从文件提取多个字符tellg获取当前字符在文件当中的位置seekg设置对文件进行操作的位置运算符重载将数据形象地以流的形式进行输入运算符重载将数据形象地以流的形式进行输出 我们建议使用和运算符对文件进行操作,因为这很方便符合我们平时的输入输出。 对文件进行写入: void WriteFile() {ofstream ofs(text.txt); //定义文件流对象打开文件并写ofs hello zhuang; //字符串流入文件ofs.close(); //关闭文件 } 对文件进行读取 void ReadFile() {ifstream ifs(text.txt); //定义流对象 打开文件并读char data[100];ifs data; //文件数据流入字符串dataifs.close(); //关闭文件 } 注 可以在定义流对象的同时指定要打开的文件名以及文件的打开方式。 关闭文件 void close(); 以二进制的形式对文件操作:
  9. 以二进制形式对文件进行写入 void WriteBin() {ofstream ofile;ofile.open(data.bin,ofstream::out | ofstream::binary); //二进制方式写入char data[] hello world;ofile.write(data,strlen(data));//将data写入文件ofile.put(!);ofile.close(); } 2.以二进制形式对文件进行读取 void ReadBin() {ifstream ifile;ifile.open(data.bin,ifstream::in | ifstream::binary);//二进制读取ifile.seekg(0,ifile.end); //跳转到文件末尾int length ifile.tellg(); //获取当前字符正在文件中的位置,即文件字符总数ifile.seekg(0,ifile.beg);char data[100];ifile.read(data.length);//将数据从文件写入dataifile.close(); }
    以文本形式操作文件 :
  10. 以文本形式对文件进行写入操作: void WriteText() {ofstream ofile;ofile.open(data.txt);//默认以写方式打开char data[] hello world;ofile.write(data,strlen(data));ofile.put(!);ofile.close(); } 2.以文本形式对文件进行读取操作: void ReadText() {ifstream ifile;ifile.open(data.txt);//二进制读取ifile.seekg(0,ifile.end); //跳转到文件末尾int length ifile.tellg(); //获取当前字符正在文件中的位置,即文件字符总数ifile.seekg(0,ifile.beg);char data[100];ifile.read(data.length);//将数据从文件写入dataifile.close(); } stringstream的简单介绍 C语言中整形转字符串 在C语言中,如果想要将一个整形变量的数据转化为字符串格式,主要有两种方式:
  11. 使用itoa()函数
  12. 使用sprintf()函数 int main() {int n 2310123;char s1[32];_itoa(n,s1,10);char s2[32];sprintf(s2,%d,n);return 0; } 注意 : 这两个函数在转化时,都得需要先给出保存结果的空间,空间大小不好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。 Cstringstream对象 在C中可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件sstream。 类操作场景ostringstream输出操作istringstream输入操作stringstream输入输出操作 stringstream主要用处
  13. 将数值类型转换为字符串 int a 10; stringstream ss; //使用流插入流提取 ss a endl; string s; ss s; cout s : s endl; //使用底层str double d 1.2; ss d endl; cout ss.str() endl; s ss.str(); cout s : s endl;
  14. 字符串拼接 stringstream sstream; // 将多个字符串放入 sstream 中 sstream first string,; sstream second string; cout strResult is: sstream.str() endl; // 清空 sstream sstream.str(); sstream third string; cout After clear, strResult is: sstream.str() endl; 3.序列化和反序列化结构数据 序列化结构信息转成字符串。 反序列化字符串转化成信息。 struct ChatInfo {string _name; // 名字int _id; // idDate _date; // 时间string _msg; // 聊天信息 }; int main() {// 结构信息序列化为字符串ChatInfo winfo { 张三, 135246, { 2022, 4, 10 }, 晚上一起看电影吧};ostringstream oss;oss winfo._name winfo._id winfo._date winfo._msg;string str oss.str();cout str endlendl;// 我们通过网络这个字符串发送给对象实际开发中信息相对更复杂// 一般会选用Json、xml等方式进行更好的支持// 字符串解析成结构信息ChatInfo rInfo;istringstream iss(str);iss rInfo._name rInfo._id rInfo._date rInfo._msg;cout ——————————————————- endl;cout 姓名 rInfo._name ( rInfo._id ) ;cout rInfo._date endl;cout rInfo._name : rInfo._msg endl;cout ——————————————————- endl;return 0; } 提取字符串流对象信息两种方式
  15. 直接使用流提取流插入
  16. 利用底层str来构造流对象从而提取转换的信息或者直接将信息用来构造流对象或者用字符串信息来构造流对象的底层str从而提取信息 class Date {friend ostream operator (ostream out, const Date d);friend istream operator (istream in, Date d); public:Date(int year 1, int month 1, int day 1):_year(year), _month(month), _day(day){}operator bool(){// 这里是随意写的假设输入_year为0则结束if (_year 0)return false;elsereturn true;} private:int _year;int _month;int _day; };istream operator (istream in, Date d) {in d._year d._month d._day;return in; }ostream operator (ostream out, const Date d) {out d._year d._month d._day;return out; }int main() {int i 123;Date d {2024,9,18};//方式一使用和stringstream ss1;ss1 i endl;ss1 d endl;int j 0 ;Date x;ss1 j x;//使用底层string对象string str ss1.str(); stringstream ss2(str);//也可以123\n2024 9 18直接构造对象//也可以stringstream ss3;ss3.str(str);//输出给j和x…return 0; } 注 这里能正确提取到数据是因为我们在转换数据成字符串时用换行符和空格进行数据分隔符因此能正确分隔如果数据格式对不上此时需要跟之前一样清理流标志(clear)并且用get等拿掉非法字符。 stringstream对象总结
  17. stringstream对象实际是在底层维护了一个string对象用来保存结果。 2.构造stringstream对象可以直接用字符串/对象构造或者构造其底层str。 3.多次数据类型转化时流的状态标志bad,eof,fail可能被设置从而导致后续操作失败因此在进行下一次转换时必须调用clear()将状态重置为goodbit才可以进行转换但是clear()不会将底层string对象清空。 4.可以使用s.str()将底层string对象清空否则多次转换时会将结果全部积累在底层string对象。 string ret; stringstream ss; ss 2024 zhuang; ss ret; cout 下一次转换 endl;//2024zhuang //清空状态和string ss.clear(); ss.str(); ss Thanks reading; cout ss.str() endl; ret ss.str(); cout ret endl; //Thanksreading 5.获取数据转换后结果有两个方法(1) 使用运算符从流当中提取。(2)使用底层str获取。 6.stringstream使用string类对象替代字符数组可以避免缓冲区溢出的风险而且对参数类型进行推演不需要进行格式化控制也不会存在格式化失败的风险因此使用更方便更安全但提取时注意数据分隔符的使用。 总结 本篇博客我们讲解了三个CIO流C标准IO流C标准文件流stringstream同时讲解三个流读写的相关操作以及一些细节。