2026/4/17 8:10:32
网站建设
项目流程
福州专业网站设计团队,西安游玩攻略,怎么注销网站备案,这么制作自己的网站1.C语言IO流C 语言中我们用到的最频繁的输入输出方式就是 scanf () 与 printf()#xff0c;scanf()#xff1a;从标准输入设备(键盘)读取数据#xff0c;并将值存放在变量中。printf()#xff1a;将指定的文字/字符串输出到标准输出设备(屏幕)注意宽度输出和精度输出控制。…1.C语言IO流C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()scanf()从标准输入设备(键盘)读取数据并将值存放在变量中。printf()将指定的文字/字符串输出到标准输出设备(屏幕)注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。如下图所示对输入输出缓冲区的理解可以屏蔽掉低级I/O的实现低级I/O的实现依赖操作系统本身内核的实现所以如果能够屏蔽这部分的差异可以很容易写出可移植的程序可以使用这部分的内容实现“行”读取的行为对于计算机而言是没有“行”这个概念有了这部分就可以定义“行”的概念然后解析缓冲区的内容返回一个“行”2.流的概念“流”即是流动的意思是物质从一处向另一处流动的过程是对一种有序连续且具有方向性的数据其单位可以是bit、byte、packet的抽象描述C流是指信息从外部输入设备如键盘向计算机内部如内存输入和从内存向外部输出设备显示器输出的过程。这种输入输出的过程被形象的比喻为“流”它的特性是有序连续、具有方向性为了实现这种流动C定义了I/O标准类库这些每个类都称为流/流类用以完成某方面的功能3.CIO流C系统实现了一个庞大的类库其中ios为基类其他类都是直接或间接派生自ios类3.1 C标准IO流C标准库提供了4个全局流对象cin、cout、cerr、clog使用cout进行标准输出即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中同时C标准库还提供了cerr用来进行标准错误的输出以及clog进行日志的输出从上图可以看出cout、cerr、clog是ostream类的三个不同的对象因此这三个对象现在基本没有区别只是应用场景不同在使用时候必须要包含文件并引入std标准命名空间注意cin为缓冲流。键盘输入的数据保存在缓冲区中当要提取时是从缓冲区中拿。如果一次输入过多会留在那儿慢慢用如果输入错了必须在回车之前修改如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后才要求输入新的数据输入的数据类型必须与要提取的数据类型一致否则出错。出错只是在流的状态字state中对应位置位置1程序继续空格和回车都可以作为数据之间的分格符所以多个数据可以在一行输入也可以分行输入。但如果是字符型和字符串则空格ASCII码为32无法用cin输入字符串中也不能有空格。回车符也无法读入操作是否跳过空白符读取内容典型场景cin ch;是下一个非空白字符读取用户输入的非空白字符如姓名首字母cin.get(ch);否下一个字符包括空白符读取文件中的原始字符如换行符cin.getline(buf, size);否读取一整行直到换行符读取包含空格的句子cin和cout可以直接输入和输出内置类型数据原因标准库已经将所有内置类型的输入和输出全部重载了对于自定义类型如果要支持cin和cout的标准输入输出需要对和进行重载在线OJ中的输入和输出对于IO类型的算法一般都需要循环输入输出严格按照题目的要求进行多一个少一个空格都不行连续输入时vs系列编译器下在输入ctrl Z时结束代码语言javascriptAI代码解释// 单个元素循环输入 while (cin a) { // ... } // 多个元素循环输入 while (c a b c) { // ... } // 整行接收 while (cin str) { // ... }istream类型对象转换为逻辑条件判断值代码语言javascriptAI代码解释istream operator (int val); explicit operator bool() const;实际上我们看到使用while(cini)去流中提取对象数据时调用的是operator返回值是istream类型的对象那么这里可以做逻辑条件值源自于istream的对象又调用了operator booloperator bool调用时如果接收流失败或者有结束标志则返回false代码语言javascriptAI代码解释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; else return 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; } // C IO流使用面向对象运算符重载的方式 // 能更好的兼容自定义类型流插入和流提取 int main() { // 自动识别类型的本质--函数重载 // 内置类型可以直接使用--因为库里面ostream类型已经实现了 int i 1; double j 2.2; cout i endl; cout j endl; // 自定义类型则需要我们自己重载 和 Date d(2022, 4, 10); cout d; while (d) { cin d; cout d; } return 0; }3.2 C文件IO流C的文件输入 / 输出File I/O通过标准库中的流类实现主要涉及以下三个类ifstreamInput File Stream用于从文件读取数据输入ofstreamOutput File Stream用于向文件写入数据输出fstreamFile Stream支持读写操作兼具ifstream和ofstream的功能3.2.1 基本使用步骤包含头文件代码语言javascriptAI代码解释#include fstream // 文件流操作 #include string // 字符串操作可选打开文件 使用构造函数或open()方法打开文件需指定文件名和打开模式打开模式可选组合ios::in读模式默认用于ifstreamios::out写模式默认用于ofstream会清空文件ios::app追加模式不清空文件在末尾写入ios::out | ios::app追加写入文件ios::binary二进制模式用于非文本文件ios::in | ios::binary以二进制模式读取文件ios::trunc截断模式打开时清空文件默认与ios::out一起使用ios::out | ios::trunc值得注意的是ios::是std的内部类必须加上代码语言javascriptAI代码解释// 方式1使用构造函数 ifstream fin(input.txt); // 读文件默认模式为 ios::in ofstream fout(output.txt); // 写文件默认模式为 ios::out ofstream fapp(append.txt, ios::out | ios::app); // 追加模式 //创建文件的时候默认调用ios::out | ios::trunc // 方式2使用 open() 方法可先创建对象后打开文件 fstream file; file.open(data.txt, ios::in | ios::out); // 读写模式检查文件是否成功打开代码语言javascriptAI代码解释if (!fin.is_open()) { // 或直接用 if (!fin) cerr 无法打开文件 endl; return 1; // 退出程序 }读写文件写入文件使用运算符类似cout 读取文件使用运算符类似cin或getline()逐行读取示例代码语言javascriptAI代码解释// 写入文件 fout Hello, World! endl; // 写入字符串和换行符 fout 42 3.14 endl; // 写入数值 // 读取文件按空格分隔 int num; double d; fin num d; // 从文件读取整数和浮点数 // 逐行读取文件 string line; while (getline(fin, line)) { // 每次读取一行直到文件结束 cout 读取的行 line endl; }关闭文件文件操作结束后使用close()方法关闭文件注意对象析构时会自动关闭文件但显式调用close()是良好习惯代码语言javascriptAI代码解释fin.close(); // 关闭输入文件 fout.close(); // 关闭输出文件3.2.2 文件操作示例写入文件覆盖模式代码语言javascriptAI代码解释#include fstream #include iostream using namespace std; int main() { ofstream fout(data.txt); // 打开文件默认覆盖模式 if (!fout) { cerr 无法打开文件 endl; return 1; } fout 姓名张三 endl; fout 年龄20 endl; fout 成绩95.5 endl; fout.close(); // 关闭文件 return 0; }读取文件逐行读取代码语言javascriptAI代码解释#include fstream #include iostream #include string using namespace std; int main() { ifstream fin(data.txt); // 打开文件用于读取 if (!fin) { cerr 无法打开文件 endl; return 1; } string line; while (getline(fin, line)) { // 逐行读取 cout line endl; } fin.close(); // 关闭文件 return 0; }追加写入文件代码语言javascriptAI代码解释#include fstream #include iostream using namespace std; int main() { // 以追加模式打开文件ios::app ofstream fout(data.txt, ios:: | ios::app); if (!fout) { cerr 无法打开文件 endl; return 1; } fout 附加信息优秀学生 endl; fout.close(); return 0; }二进制文件读写使用write()和read()方法操作二进制数据需指定数据地址和长度代码语言javascriptAI代码解释#include fstream using namespace std; struct Student { char name[20]; int age; double score; }; int main() { // 写入二进制文件 Student s {李四, 21, 89.5}; ofstream fout(student.bin, ios::binary); fout.write(reinterpret_castconst char*(s), sizeof(Student)); fout.close(); // 读取二进制文件 Student readStudent; ifstream fin(student.bin, ios::binary); fin.read(reinterpret_castchar*(readStudent), sizeof(Student)); fin.close(); return 0; }4.stringstream在C语言中如果想要将一个整形变量的数据转化为字符串格式如何去做使用itoa()函数使用sprintf()函数但是两个函数在转化时都得需要先给出保存结果的空间那空间要给多大呢就不太好界定而且转化格式不匹配时可能还会得到错误的结果甚至程序崩溃代码语言javascriptAI代码解释int main() { int n 123456789; char s1[32]; _itoa(n, s1, 10); char s2[32]; sprintf(s2, %d, n); char s3[32]; sprintf(s3, %f, n); return 0; }在C中可以使用stringstream类对象来避开此问题在程序中如果想要使用stringstream必须要包含头文件。在该头文件下标准库三个类istringstream、ostringstream和stringstream分别用来进行流的输入、输出和输入输出操作本文主要介绍stringstreamstringstream主要可以用来将数值类型数据格式化为字符串代码语言javascriptAI代码解释#includesstream int main() { int a 12345678; string sa; // 将一个整形变量转化为字符串存储到string类对象中 stringstream s; s a; s sa; // clear() // 注意多次转换时必须使用clear将上次转换状态清空掉 // stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit // 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换 // 但是clear()不会将stringstreams底层字符串清空掉 // s.str(); // 将stringstream底层管理string对象设置成, // 否则多次转换时会将结果全部累积在底层string对象中 s.str(); s.clear(); // 清空s, 不清空会转化失败 double d 12.34; s d; s sa; string sValue; sValue s.str(); // str()方法返回stringsteam中管理的string类型 cout sValue endl; return 0; }字符串拼接代码语言javascriptAI代码解释int main() { 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; return 0; }序列化和反序列化结构数据代码语言javascriptAI代码解释struct ChatInfo { string _name; // 名字 int _id; // id Date _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 endl endl; // 我们通过网络这个字符串发送给对象实际开发中信息相对更复杂 // 一般会选用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; }注意4.stringstream实际是在其底层维护了一个string类型的对象用来保存结果 5. 多次数据类型转化时一定要用clear()来清空才能正确转化但clear()不会将stringstream底层的string对象清空 6. 可以使用s. str()方法将底层string对象设置为空字符串 7. 可以使用s.str()将让stringstream返回其底层的string对象 8.stringstream使用string类对象代替字符数组可以避免缓冲区溢出的危险而且其会对参数类型进行推演不需要格式化控制也不会出现格式化失败的风险因此使用更方便更安全www.dongchedi.com/article/7598662619591098905www.dongchedi.com/article/7598661663487148606www.dongchedi.com/article/7598661165073383960www.dongchedi.com/article/7598661590610706968www.dongchedi.com/article/7598659598723203609www.dongchedi.com/article/7598660331644518974www.dongchedi.com/article/7598659182870970942www.dongchedi.com/article/7598659511842849304www.dongchedi.com/article/7598658577318265369www.dongchedi.com/article/7598660363760206398www.dongchedi.com/article/7598659848598962750www.dongchedi.com/article/7598658231610884632www.dongchedi.com/article/7598655027276071449www.dongchedi.com/article/7598656521844949566www.dongchedi.com/article/7598656663327261246www.dongchedi.com/article/7598657570517058110www.dongchedi.com/article/7598656249982550590www.dongchedi.com/article/7598655008087196222www.dongchedi.com/article/7598654082278408728www.dongchedi.com/article/7598654850569667096www.dongchedi.com/article/7598653079990911513www.dongchedi.com/article/7598653503171052094www.dongchedi.com/article/7598653873355948569www.dongchedi.com/article/7598651016690975257www.dongchedi.com/article/7598653584766632510www.dongchedi.com/article/7598652418918056473www.dongchedi.com/article/7598651546129203737www.dongchedi.com/article/7598650859257397785www.dongchedi.com/article/7598650664986001982www.dongchedi.com/article/7598649187739517464www.dongchedi.com/article/7598650458629997080www.dongchedi.com/article/7598649332920975934www.dongchedi.com/article/7598650344322925081www.dongchedi.com/article/7598649267225477657www.dongchedi.com/article/7598650803637043774www.dongchedi.com/article/7598647318044754456www.dongchedi.com/article/7598647158111552025www.dongchedi.com/article/7598646871380263486www.dongchedi.com/article/7598647318044721688www.dongchedi.com/article/7598645874076008985www.dongchedi.com/article/7598647443848675902