我刚刚了解到ios_base::sync_with_stdio函数的存在,它基本上允许你关闭(或者如果你已经关闭它)iostream在C++中使用的cstdio流和作为标准C的一部分的流之间的同步.
现在,我一直认为stdout,stderr和stdin用C基本上包裹在一组++的输入输出流类在C对象的.但如果它们必须彼此同步,这将表明C++的iostream类不是 C stdin等的包装器 .
我很困惑这个?有人可以澄清C++的的iostream和C的标准输入输出是如何不同的东西,做同样的事情,只是在不同的抽象级别?我以为他们是一回事!
它们是如何同步的呢?我一直认为它们是同一个东西,一个包装另一个,基本上.
如何在C++中实现scanf("%d # %d",&a,&b);某种效果cin?
注意:这不是现有std::ios::sync_with_stdio(false)问题的重复。我已经经历了所有这些,但我无法cout像printf. 示例代码和证据如下所示。
我有三个源代码文件:
// ex1.cpp
#include <cstdio>
#include <chrono>
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 10000000; i++) {
printf("%d\n", i);
}
auto t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
fprintf(stderr, "%lld\n", duration.count());
}
Run Code Online (Sandbox Code Playgroud)
// ex2.cpp
#include <iostream>
#include <chrono>
int main()
{
auto t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 10000000; i++) {
std::cout << i << '\n';
}
auto t2 …Run Code Online (Sandbox Code Playgroud) 有人可以解释微妙的区别:
ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.rdbuf();
f.good() // filestream is bad!!
ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.str();
f.good() // is still ok!
Run Code Online (Sandbox Code Playgroud)
我主要使用.rdbuf()将字符串流推送到文件中(因为它更有效),但是如果字符串流为空而不是文件流变坏...?这不是傻瓜吗?我想我不太明白<< s.rdbuf()......
__inline int my_sprintf (char *dest,char *format,...)
{
va_list va;
va_start(va,format);
return vsprintf(dest,format,va);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法将缓冲区大小参数添加到my_sprintf,因为它在超过50k的位置使用,我不能用vsprintf_s或vsnprintf替换vsprintf.
任何替代方案可以使上述功能更安全吗?
#include <cstdio>
#include <cstdint>
#include <cassert>
int main() {
std::uint64_t ui;
char c;
auto ret = std::sscanf("111K", "%lu64%[B, K, M, G]", &ui, &c);
assert(ret == 2);
assert(ui == 111);
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用从一个字符串sscanf读取 auint64_t和 a ,但每次我尝试此操作时char它都只读取它ui(断言失败)。ret == 2
任何人都可以清楚我的怀疑..为什么这个程序给出10作为输出.你能解释一下机制吗... for循环也有; 在陈述之前
#include <iostream>
using namespace std;
int main() {
int i ;
for ( i =0 ; i<10 ; i++);
{
cout<<i ;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在C++中,如果我从一个字符串中读取一个整数,那么我是否使用u或d作为转换说明符并不重要,因为它们都接受负整数.
#include <cstdio>
using namespace std;
int main() {
int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
puts(u == d ? "u == d" : "u != d");
printf("u: %u %d\n", u, u);
printf("d: %u %d\n", d, d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我挖得更深,发现是否有任何区别.我找到
int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
Run Code Online (Sandbox Code Playgroud)
相当于
int u, d;
u = strtoul("-2", NULL, 10);
d = strtol("-2", NULL, 10);
Run Code Online (Sandbox Code Playgroud)
是否有任何差异之间的所有u和d使用解析这些转换说明,即传递给格式时scanf …