C++ FAQ Lite[15]--通过 <iostream> 和 <cstdio>输入/输出(新)

分析android逆向的学习路线 俗话说:“一入逆向深似海,从此头发是路人”。 安卓逆向作为当下热门行业“网络安全”的主要技术之一,已经受到了越来越多人的青睐。但是很多刚入门的新手小伙伴对于怎么去学习却还很是迷糊。本文就分享一下android逆向的学习路线供大家参考。 目前学习安卓逆向的人群大约分为两种: 第一种是完全没有任何基础的计算机纯小白; 第二种是本来就做开发懂编程的IT行业人员。 我们就针对这两个不同的人群做一下安卓逆向的学习路线分析。 一、无基础小白想入门 作为没有任何基础想要入门的计算机纯小白,学习上推荐参照以下步骤: (一 阅读详情

 

[15] 通过 <iostream> 和 <cstdio>输入/输出
(Part of C++ FAQ Lite, Copyright © 1991-2001, Marshall Cline, cline@parashift.com)

简体中文版翻译:申旻,nicrosoft@sunistudio.com(东日制作室,东日文档)


FAQs in section [15]:


[15.1] 为什么应该 <iostream> 而不是传统的 <cstdio>?
[Recently renamed "subclassable" to "inheritable" and revamped to use new-style headers (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

因为<iostream>加强了类型安全,减少了错误,提升了性能,可扩展,并且提供继承。

 

printf() 不错,scanf() 不管其可能导致错误,也还是有价值的,然而对于 C++ I/O(译注:I/O即输入/输出) 所能做的来说,它们的功能都是非常有限的。相对于C (使用 printf() 和 scanf())来说,C++ I/O (使用 << 和 >>)是:

 

更好的类型安全:使用 <iostream>,编译器静态地知道被 I/O 的对象的类型。相反,<cstdio>使用“%”域来动态地指出类型。
更少的错误倾向:使用 <iostream>,没有多余的必须与实际被 I/O的对象相一致的“%”。去除多余的,意味着去除了一类错误。
可扩展:C++ <iostream> 机制允许在不破坏现有代码的情况下,新的用户定义类型能够被I/O。(可以想象一下,每个人同事添加新的不相容的“%” 域到printf() 和 scanf(),是怎样的混乱场面?!)。
可继承:C++ <iostream> 机制是建立在真正的类上的,如 std::ostream 和 std::istream。不象 <cstdio>的 FILE*,有真正的类,因此可继承。这意味着你可以你可以拥有其他的用户定义的看上去以及其效果都类似流的东西,而它可以做任何你需要的奇怪的和有趣的事情。你将自动的得到无数行的你所不认识的用户写的 I/O代码,并且,他们不需要认识你写的“extended stream”类。
[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.2] 当键入非法字符时,为何我的程序进入死循环?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

举个例子,假设你有如下的代码,从std::cin读取一个整数:

 


 #include <iostream>
 
 int main()
 {
   std::cout << "Enter numbers separated by whitespace (use -1 to quit): ";
   int i = 0;
   while (i != -1) {
     std::cin >> i;        // 不良的形式 — 见如下注释
     std::cout << "You entered " << i << '/n';
   }
 }
该程序没有检查键入的是否是合法字符。尤其是,如果某人键入的不是整数(如“x”),std::cin流进入“失败状态”,并且其后所有的输入尝试都不作任何事情而立即返回。换句话说,程序进入了死循环;如果42是最后成功读到的数字,程序会反复打印“You entered 42”消息。

 

检查合法输入的一个简单方法是将输入请求从 while 循环体中移到 while 循环的控制表达式,如:

 

 

 

 #include <iostream>
 
 int main()
 {
   std::cout << "Enter a number, or -1 to quit: ";
   int i = 0;
   while (std::cin >> i) {    // 良好的形式
     if (i == -1) break;
     std::cout << "You entered " << i << '/n';
   }
 }
这样的结果就是当你敲击end-of-file,或键入一个非整数,或键入 -1 时, while 循环会退出。

 

(自然,你也可以不用break,而将while循环表达式while (std::cin >> i)改为((std::cin >> i) && (i != -1)),但这不是本FAQ的重点,本 FAQ 处理iostream,而不是一般的结构化编程指南。)

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.3] 那个古怪的while (std::cin >> foo)语法如何工作?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

“古怪的 while (std::cin >> foo)语法”的例子见前一个FAQ。

 

(std::cin >> foo)表达式调用了适当的operator>>(例如,它调用了左边带有std::istream参数以及,如果的类型是int,并且右边有一个int&的operator>>)。std::istream operator>>函数按惯例地返回左边的参数,在这里,它返回std::cin。下一步编译器注意到返回的 std::istream处于一个布尔型的上下文中,因此编译器将std::istream转换为一个布尔值。

 

编译器调用一个称为std::istream::operator void*()的成员函数来将std::istream转换成布尔。它返回一个被转换成布尔的void*指针(NULL成为false,任何其他的指针成为true)。因此在这里,编译器产生了std::cin.operator void*()的调用,就如同你象(void*) std::cin这样显式地强制类型转换。

 

如果stream处于良好状态,那么转换算符operator void*()返回非指针,如果处于失败状态,则返回 NULL。例如,如果读了太多次(也就是说,已经处于end-of-file),或实际输入到流的信息不是foo的合法类型(如,如果 foo是一个int,而数据是一个“x”字符),流会进入失败状态并且转换算符会返回NULL。

 

  operator>>不是简单地返回一个bool(或 void*)以支出是否成功或失败的原因是为了支持“级联”语法:

 


   std::cin >> foo >> bar;
operator>>是向左结合的,意味着如上的代码会解释为:

 


   (std::cin >> foo) >> bar;
换句话说,如果我们将operator>>变为一个普通的函数名称,如readFrom(),将变为这样的表达式:

 


   readFrom( readFrom(std::cin, foo), bar);
我们总是从最内部开始计算表达式。因为 operator>>的左结合性,就成了最左边表达式std::cin >> foo。该表达式返回std::cin (更合适的,他返回一个它左边参数的引用)给下一个表达式。下一个表达式也返回(一个引用)给std::cin,但第二个引用被忽略了,因为它是这个“表达式语句”的最外边的表达式了。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.4] 为何我的输入处理会超过文件末尾?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

因为只有在试图超过文件末尾后,eof标记才会被设置。也就是,在从文件读最后一个字节时,还没有设置 eof 标记。例如,假设输入流映射到键盘——在这种情况下,理论上来说,C++库不可能预知到用户所键入的字符是否是最后一个字符。

 

如,如下的代码对于计数器 i 会有“超出 1”的错误:

 


 int i = 0;
 while (! std::cin.eof()) {   // 错误!(不可靠)
   std::cin >> x;
   ++i;
   // Work with x ...
 }
你实际需要的是:

 


 int i = 0;
 while (std::cin >> x) {      // 正确!(可靠)
   ++i;
   // Work with x ...
 }
[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.5] 为什么我的程序在第一个循环后,会忽略输入请求呢?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

因为数字的提取器将非数字留在了输入缓冲器之后。

 

如果你的代码看上去象这样:

 


 char name[1000];
 int age;
 
 for (;;) {
   std::cout << "Name: ";
   std::cin >> name;
   std::cout << "Age: ";
   std::cin >> age;
 }
而你实际需要的是:

 


 for (;;) {
   std::cout << "Name: ";
   std::cin >> name;
   std::cout << "Age: ";
   std::cin >> age;
   std::cin.ignore(INT_MAX, '/n');
 }
当然,你也许想将for (;;)语句变为while (std::cin),但不要搞错,在循环末尾通过std::cin.ignore(...);这一行跳过非数字字符。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.6] 如何为class Fred提供打印?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

用算符重载提供一个友元的左切换的算符 operator<<。

 


 #include <iostream>
 
 class Fred {
 public:
   friend std::ostream& operator<< (std::ostream& o, const Fred& fred);
   // ...
 private:
   int i_;    // 只是为了说明
 };
 
 std::ostream& operator<< (std::ostream& o, const Fred& fred)
 {
   return o << fred.i_;
 }
 
 int main()
 {
   Fred f;
   std::cout << "My Fred object: " << f << "/n";
 }
由于 Fred 对象是 << 算符的右边的操作数,我们使用非成员函数(在这里是一个友元)。如果 Fred 对象被期望为在<<的左边(那就是 myFred << std::cout而不是 std::cout << myFred),则就会有一个命名为operator<<的成员函数。

 

注意,operator<<返回流。这就使得输出算符能够被级联。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.7] 但我可以总是使用 printOn() 方法而不是一个友元函数吗?
[Recently created (on 7/00) and fixed a bug thanks to Richard Hector (on 4/01). Click here to go to the next FAQ in the "chain" of recent changes.]

 

不。

 

通常人们总是愿意使用printOn()方法而不是一个友元函数的原因是因为他们错误地相信友元破坏了封装并且/或者友元是不良的。这些信仰是天真的和错误的:适当的使用,友元实际上可以增强封装。

 

这也不是说printOn() 方法没用。例如:为一个完整的继承层次的类提供打印时就是有用的。但如果你看到一个printOn() 方法,它通常应该是protected的,而不是public的。

 

为完整,这里给出“printOn() 方法”。想法是有一个成员函数(通常被称为printOn(),来完成实际的打印,然后有一个operator<<来调用rintOn()方法)。当错误地完成它时,printOn()方法是public 的,因此operator<<不需要成为友元——它成为一个简单的顶级函数,即不是类的友元,也不是类的成员函数。这是一些示例代码:

 

 

 

 #include <iostream>
 
 class Fred {
 public:
   void printOn(std::ostream& o) const;
   // ...
 };
 
 // operator<< 可以被声明为非友元 [不推荐!]
 std::ostream& operator<< (std::ostream& o, const Fred& fred);
 
 // 实际打印由内部的 printOn() 方法完成 [不推荐!]
 void Fred::printOn(std::ostream& o) const
 {
   // ...
 }
 
 // operator<< 调用 printOn() [不推荐!]
 std::ostream& operator<< (std::ostream& o, const Fred& fred)
 {
   fred.printOn(o);
   return o;
 }
人们错误地假定“由于避免了出现一个友元函数”而减少了维护成本。这个假定是错误的,因为:

 

在维护成本上,“顶级函数调用成员”方法不会带来任何好处。我们假设 N 行代码来完成实际的打印。在使用友元函数的情况下,那 N 行代码将直接访问类的 private/protected 部分,这意味着某人无论何时改变了类的 private/protected 部分,那 N 行代码将需要被扫描并且可能被修改,这增加了维护成本。然而,使用 printOn() 方法并没有改变:我们仍然有 N 行代码直接访问类的 private/protected 部分。因此将代码从友元函数移到成员函数根本就并不减少维护成本。没有减少。在维护成本上没有好处。(如果有的话,printOn()方法更差一点,因为你有了一个额外的原先没有的函数,现在有更多行的代码需要被维护)
“顶级函数调用成员”方法使得类更难被使用,尤其是程序员不是类的设计者时。这种方法将一个并不期望被调用的public方法暴露给程序员。当程序员阅读类的public方法时,他们会看见两种方法做同一件事情。文档需要象这样说明:“这个和那个并不完全一样,但不要用这个;而应该用那个”。并且通常的程序员会说:“唔?如果我不应该使用它,为什么它是 public的?”事实上printOn()方法是public的唯一理由是避免将友元授权给 operator<<,这个主张对于某些仅仅想使用这个类的程序员来说,是微妙的并且难以理解的。
总之,“顶级函数调用成员”方法有成本,没有收益。因此,通常,不是好主意。

 

注意:如果 printOn()方法是protected或private的,第二个异议将不成立。有些情况这方法是合理的,如为一个完整的继承层次的类提供打印时。同样要注意,当printOn()方法是非public的时, operator<< 需要成为友元。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.8] 如何为 class Fred提供输入?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

使用算符重载提供一个友元的右切换的算符operator>>。除了参数没有一个const:“Fred&”而不是“const Fred&”,其他和输出算符类似。

 


 #include <iostream>
 
 class Fred {
 public:
   friend std::istream& operator>> (std::istream& i, Fred& fred);
   // ...
 private:
   int i_;    // 只是为了说明
 };
 
 std::istream& operator>> (std::istream& i, Fred& fred)
 {
   return i >> fred.i_;
 }
 
 int main()
 {
   Fred f;
   std::cout << "Enter a Fred object: ";
   std::cin >> f;
   // ...
 }
注意operator>>返回流。这就使得输入算符能被级联和/或在循环或语句中使用。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.9] 如何为完整继承层次的类提供打印?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

提供一个友元的operator<<调用一个protected virtual函数:

 


 class Base {
 public:
   friend std::ostream& operator<< (std::ostream& o, const Base& b);
   // ...
 protected:
   virtual void printOn(std::ostream& o) const;
 };
 
 inline std::ostream& operator<< (std::ostream& o, const Base& b)
 {
   b.printOn(o);
   return o;
 }
 
 class Derived : public Base {
 protected:
   virtual void printOn(std::ostream& o) const;
 };
最终结果是operator<< 就象是动态绑定,即使它是一个友元函数。这被称为“虚友元函数用法”。

 

注意派生类重写了printOn(std::ostream&) const。尤其是,它们不提供他们自己的 operator<<。

 

自然的,如果 Base是一个ABC(抽象基类),Base::printOn(std::ostream&) const可以用“= 0”语法被声明为纯虚函数。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.10] 在DOS 和/或 OS/2环境下,如何以二进制模式“重打开” std::cin 和 std::cout ?
[Recently changed so it uses new-style headers and the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

这依赖于实现,请查看你的编译器的文档。

 

例如,假设你想使用std::cin和 std::cout进行二进制 I/O。更假设你的操作系统(如DOS 或 OS/2)坚持将从std::cin输入的“/r/n”翻译为“/n”,将从 std::cout或std::cerr输出的“/n”翻译为“/r/n”。

 

不行的是没有标准方法使得std::cin,std::cout和/或std::cerr以二进制模式被打开。关闭流并且试图以二进制方式重打开它们,可能会得到非期望的或不合需要的结果。

 

在系统的区别处,实现可能提供了一种方法使它们成为二进制流,但你必须查看手册来找到。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.11] 为何我不能在如“../test.dat”这样的不同的目录打开文件?
[Recently changed so it uses new-style headers and uses the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

因为“/t”是一个 tab 字符。

 

你应该在文件中使用正斜杠,即使在使用反斜杠的操作系统,如 DOS, Windows, OS/2等中。例如:

 

 

 

 #include <iostream>
 #include <fstream>
 
 int main()
 {
   #if 1
     std::ifstream file("../test.dat");  // 正确!
   #else
     std::ifstream file("../test.dat");  // 错误!
   #endif
 
   // ...
 }
记住,反斜杠(“/”)被用来在字符串中建立特殊字符:“/n”是换行,“/b”是退格,以及“/t”是一个tab,“/a”是一个警告(alert),“/v”是一个vertical-tab等。因此文件名“/version/next/alpha/beta/test.dat”被解释为一堆有区的字符;应该用“/version/next/alpha/beta/test.dat”来替代,即使系统中使用“/”作为目录分隔符,如DOS, Windows, OS/2等。这是因为操作系统中的库例程是可交换地处理“/”和“/”的。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.12] 如何将一个值(如,一个数字)转换为 std::string?
[Recently created thanks to Rob Stewart (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

有两种方法:可以使用<stdio>工具或<iostream>库。通常,你应该使用<iostream>库。

 

  <iostream> 库允许你使用如下的语法(转换一个double的示例,但你可以替换美妙的多的任何使用<<算符的东西)将任何美妙得多的东西转换为 std::string:

 

 

 

 #include <iostream>
 #include <sstream>
 #include <string>
 
 std::string convertToString(double x)
 {
   std::ostringstream o;
   if (o << x)
     return o.str();
   // 这儿进行一些错误处理...
   return "conversion error";
 }
std::ostringstream 对象 o 提供了类似std::cout提供的格式化工具。你可以使用操纵器和格式化标志来控制格式化的结果,就如同你用std::cout可以做到的。

 

在这个例子中,我们通过被重载了的插入运算符<<,将 x 插入到 o。它调用了iostream的格式化工具将 x 转换为一个std::string。 if 测试保证转换正确工作——对于内建/固有类型,总是成功的,但 if 测试是良好的风格。

 

表达式os.str()返回包含了被插入到流 o 中的任何东西的std::string ,在这里,是 x 的值的字符串。

 

[ Top | Bottom | Previous section | Next section ]

 


--------------------------------------------------------------------------------

 


[15.13] 如何将 std::string 转换为数值?
[Recently created thanks to Rob Stewart (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]

 

有两种方法:可以使用<stdio>工具或<iostream>库。通常,你应该使用<iostream>库。

 

<iostream> 库允许你使用如下的语法(转换一个 double的示例,但你可以替换美妙的多的任何能使用 >> 算符被读取的东西)将一个std::string转换为美妙得多的任何东西:

 


 #include <iostream>
 #include <sstream>
 #include <string>
 
 double convertFromString(const std::string& s)
 {
   std::istringstream i(s);
   double x;
   if (i >> x)
     return x;
   // 这儿进行一些错误处理...
   return 0.0;
 }
std::istringstream 对象 i 提供了类似std::cin提供的格式化工具。你可以使用操纵器和格式化标志来控制格式化的结果,就如同你用std::cin能做到的。

 

在这个示例中,我们传递了td::string s来初始化std::istringstream i (例如,s 可能是字符串“123.456”),然后我们通过被重载了的抽取运算符 >>,将 i 抽取到 x。它调用了iostream的格式化工具对字符串进行尽可能的/适当的基于 x 的类型的转换。

 

if 测试保证了转换正确地工作。例如,如果字符串包含不适合 x 类型的字符,if 测试将失败。

 

[ Top | Bottom | Previous section | Next section ]


E-Mail E-mail the author
[ C++ FAQ Lite | Table of contents | Subject index | About the author | © | Download your own copy ]
Revised Apr 8, 2001

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战 本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。 阅读详情

相关推荐

Open FPV VTX与Betaflight的MSP协议配置详解:从硬件连接到OSD显示

本文详细解析了如何通过MSP协议将Open FPV VTX与Betaflight飞控进行深度集成,实现飞行数据在OSD上的稳定显示。内容涵盖从硬件连接、Betaflight端口MSP服务启用,到VTX侧配置与OSD元素布局调校的全流程,并提供了常见问题的排查思路,帮助FPV玩家构建可靠的数据叠加系统。

weixin_29201933的博客 456

iostream cstdio区别

cstdio是C语言标准库的一部分,提供了传统的C语言风格的输入输出函数,如printf、scanf、fopen、fclose等。printf() 函数是 C 语言的标准库函数之一,用于将指定的值以指定的格式输出到标准输出设备(通常是终端窗口)。scanf() 函数是 C 语言的标准库函数之一,用于从标准输入设备(通常是键盘)读取用户输入的数据。要注意的是,scanf() 函数将读入的数据存储在变量中,需要使用取地址符 & 获取变量的地址。其中,stream 是要关闭的文件指针。

xnrbjy的博客 3882

玩转Docker | 使用Docker部署Trilium Notes知识库工具

玩转Docker | 使用Docker部署Trilium Notes知识库工具

qq_59334230的博客 1441

笔记25:头文件<iostream>和<cstdio>有什么区别

(1)他们的不同之处:类型安全提供了类型安全的输入和输出,因为它使用了C++的重载运算符来适应不同的数据类型,从而减少了类型错误的可能性。中的函数(如printf和scanf)是非类型安全的,因为它们使用格式化字符串,需要手动指定要读取或写入的数据类型,如果格式化字符串与实际数据类型不匹配,可能会导致运行时错误。面向对象是面向对象的,它基于C++的类和对象模型,允许你通过操作流对象来执行输入和输出操作。

weixin_44063383的博客 4422

Python 爬虫实战:拼多多商品评论情感分析(含词云生成与差评预警)

在电商行业竞争日益激烈的当下,商家对商品评论的分析需求愈发迫切。通过 Python 爬虫收集拼多多商品评论,并结合情感分析、词云可视化及差评预警技术,商家可精准洞察消费者反馈,优化商品与服务。本文将深度剖析从爬虫搭建到数据挖掘的关键环节,助力读者构建全流程电商评论分析系统。

yansideyucsdn的博客 1450

即插即用系列(代码实践) | CVPR 2025 WPFormer:小波与原型增强Transformer——表面缺陷检测SOTA,专治弱缺陷与杂乱背景

摘要:本文提出了一种基于小波变换和原型增强的Transformer模型(WPFormer),用于像素级表面缺陷检测。该模型针对工业场景中微弱缺陷难以识别和杂乱背景干扰严重的问题,创新性地将小波变换引入Transformer的注意力机制,通过频域信息分离噪声与边缘特征,同时利用原型向量引导查询,实现了更精准的缺陷定位。核心模块包括小波增强交叉注意力(WCA)和原型引导交叉注意力(PCA),适用于工业缺陷检测、伪装目标检测和医学图像分割等任务。代码已开源,支持即插即用集成到现有框架中。

分享顶会顶刊论文即插即用模块 301

c语言cstdio什么意思,<iostream>与<cstdio>有什么区别?

该楼层疑似违规已被系统折叠隐藏此楼查看此楼列个提纲:1.cstdio是面向“文件”的,或者不强调文件和非文件流的区别,默认流就是可以关联外部文件,至于文件的外延是啥就不管,扔给宿主环境了。从std::FILE这个名字以及printf/scanf接口描述基于fprintf/fscanf上就可以看出来。iostream头只是包含了一坨东西,封装标准输入输出流,和文件流(在)不通用。2.cstdio不...

weixin_42364539的博客 8525

3.2 直流无刷电机(BLDC):状态空间模型与传递函数

状态空间模型和传递函数是分析BLDC电机动态特性的重要工具。状态空间模型通过微分方程描述系统内部状态与输入输出关系,适用于多变量系统分析;传递函数则在频域表征系统特性,便于控制器设计。本文详细推导了三相坐标系和dq坐标系下的BLDC电机状态空间模型,讨论了线性化方法,并介绍了从状态空间模型到传递函数的转换过程。这些模型为BLDC电机的控制系统设计提供了理论基础。

技术工作者 246

c/c++输入和输出标准库stdio和iostream介绍

c/c++输入和输出标准库stdio和iostream介绍

世界那么大,我想去看看~【随心更新,看世界去了😄】 3456

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

RH850从0搭建Autosar开发环境【7】- Davinci Configurator之CanTp模块配置详解(上)

weixin_42412049的博客 2300

手把手教你学Simulink--基于Simulink的高增益DC-DC变换器仿真建模

特点高电压增益:可以在不使用变压器的情况下实现较大的电压升压比。适用于低电压源:如太阳能电池板、燃料电池等提供的低压直流电源。效率问题:设计时需特别注意提高效率,减少能量损失。挑战电路复杂性:通常涉及多个电感和电容,以及复杂的开关模式。元件选择:合适的元件参数对于达到理想性能至关重要。控制策略:确保高效稳定运行的同时,适应负载变化。首先明确要模拟的任务内容。实现特定的电压增益比(例如从24V升至380V)。根据预期的输入输出电压确定合适的电路拓扑和元件值。

MHD0815的博客 174

C语言入门篇——输入输出篇

系统调用是软中断,频繁调用,需要频繁陷入内核态,这样的效率不是很高,而 printf 实际是向用户空间的 IO 缓冲写,在满足条件的情况下才会调用 write 系统调用,减少 IO 次数,提高效率。一般都使用一个空格。虽然编译的时候不会报错,但从程序功能的角度讲就是错的,则无法实现我们需要的功能。将这两个字符转化成十进制数 30,最后通过 “取地址 input” 找到变量 input 的地址,再将数字 30放到以变量 input 的地址为地址的变量中,即变量 input 中,所以最终的输出结果就是。

sakura0908的博客 2万+

利用 Python 构建高效爬虫爬取国家标准文献——从基础到进阶

然而,由于许多标准文献需要从特定网站获取,手动下载既耗时又低效,因此构建自动化爬虫成为一种实用且高效的解决方案。本文从技术选型、网站分析、代码实现到反爬优化,全面讲解了如何爬取国家标准文献。国家标准文献(National Standards Literature)是国家对各领域统一规范的文件,涵盖了技术参数、测试方法、生产工艺等内容。因此,通过自动化爬虫技术进行文献爬取和管理,不仅能解放劳动力,还可以提高数据管理效率。在构建爬虫前,我们需要对目标网站进行分析,包括页面结构、请求方式以及可能的反爬机制。

2201_76125261的博客 2105

<cstdio> vs <iostream>

根据CC-BY-SA许可协议发布

yongpassby的博客 954

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

#include<cstdio>,#include<iostream>,#include<bits/stdc++.h>库之间的区别(自查)

是 C++ 中常用的头文件,但它们的功能和用途有所不同。如果是编程比赛或者上机考试,推荐使用后一种库,简便。C 标准库的一部分,适合需要高性能输入输出的场景。如果是初学者可以使用前两个库,方便熟悉了解运用。C++ 标准库的一部分,支持面向对象编程。:包含几乎所有 C++ 标准库的头文件。非标准头文件,仅适用于 GCC 编译器。:提供 C++ 风格的标准输入输出流。:提供 C 风格的标准输入输出函数。输入输出更安全,类型检查更严格。方便竞赛编程,减少头文件管理。所有标准库头文件(如。包含所有标准库头文件。

m0_68466889的博客 1648

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++ 的iostream 和 c++的stdio的区别和联系

iostream更加符合 C++ 的面向对象风格,提供了类型安全、扩展性强的输入输出方式,适合复杂程序和自定义类型的输入输出。stdio.h提供了传统的 C 风格输入输出函数,简单、高效,但在类型安全和扩展性方面不如iostream,适合性能要求较高的场景。在 C++ 编程中,建议使用iostream,特别是编写的是面向对象的代码或处理复杂类型时。然而,如果对性能有较高要求,或者需要与遗留的 C 代码兼容,stdio.h仍然是一个可用的选择。

HJQD777的博客 3080

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言输入输出(stdio)

printf : 标准IO的外设IO,输出 ,将程序的数据输出到控制台 scanf : 标准IO的外设IO,输入,通过键盘输入数据

luxclu的博客 1038

#笔记 C语言 stdio 标准输入输出

C语言stdio 标准输入输出

优快云_K_的博客 1567

c++头文件:stdio.h ,cstdio ,iostream

转载自:低调学习C++ 首先,stdio.h是c语言主要的一个头文件,是指 “standard input & output"(标准输入输出)。而到了c++里,常用iostream(输入输出流), 【#include是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件。 在旧的标准C++中,使用#include<iostream.h> 但在新标准中,用#include,而且在VC中编程的同时要注意要添加: using namespace std; 在C++中,输入输出流被

Kiraandyours的博客 5229

C++输入输出:iostream还是cstdio?

<iostream>快还是<cstdio>快?切不可人云亦云,误了OI大事!cout和printf,cin和scanf,究竟谁快?赶快来看一看吧~^_^

qaqwqaqwq的博客 6335

c/c++输入输出流iostream与stdio之间的区别

属于c++语言,开发c++程序可以用stdio和iostream,推荐使用 iostream,输入输出格式为cout<<..,cin>>..#include<iostream.h>仅仅支持字符流,不能引入命名空间,否则会编译出错。属于c语言,开发c程序用stdio,输入输出格式为printf(),scanf()(先从自定义的文件中查找,如果找不到再从编译器自带的函数库中寻找),任何符合标准的C++开发环境都要有这个头文件,直接从编译器自带的函数库中寻找文件),而。在新的标准C++中使用。

快乐的小鱼123 2万+

c++头文件:stdio.h ,cstdio ,iostream ,bits/stdc++.h

关于c++头文件   看到计蒜课里c++课程里用了这些头文件,并不懂什么意思,于是百度得出结果= - =   首先,stdio.h是c语言主要的一个头文件,是指 “standard input & output"(标准输入输出)。而到了c++里,常用iostream(输入输出流),    【#include是标准的C++头文件,任何符合标准的C++开发环境都有这个头文件。

caotsinghua的博客 1万+

关于cstdio和iostream,以及有关namespaces的问题

1.cstdio是面向“文件”的,或者不强调文件和非文件流的区别,默认流就是可以关联外部文件,至于文件的外延是啥就不管,扔给宿主环境了。从std::FILE这个名字以及printf/scanf接口描述基于fprintf/fscanf上就可以看出来。 iostream头只是包含了一坨东西,封装标准输入输出流,和文件流(在&lt;fstream&gt;)不通用。 2.cstdio不知道iostream...

Scarlett 5812

iostream和iostream.h和stdio.h的区别

#include 非标准输入输出流 #include 标准输入输出流 C++中为了避免名字定义冲突,特别引入了“名字空间的定义”,即namespace。 当代码中用时,输出可直接引用cout //继承C语言的标准库文件,未引入名字空间定义,所以可直接使用。 当代码中引入时,输出需要引用std::cout 如果还是按原来的方法就会有错。 使用时,引入std::有以下方法:

Oliver King 的小窝 3万+

尽量用<iostream>而不用<stdio.h>

是的,scanf和printf很轻巧,很高效,你也早就知道怎么用它们,这我承认。但 尽管他们很有用,事实上scanf和printf及其系列还可以做些改进。尤其是,他们 不是类型安全的,而且没有扩展性。因为类型安全和扩展性是C++的基石,所以你 也要服从这一点。另外,scanf/printf系列函数把要读写的变量和控制读写格式的 信息分开来,就象古老的FORTRAN那样。是该向五十年代说诀别

梦想起航的地方 1万+
上一篇: 浅谈Object Pascal的指针
下一篇: 再谈异常——谈C++与Object Pascal中的构造函数与异常
Nicrosoft
博客等级 码龄26年 9粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值