标签: cstdio

cstdio流与iostream流?

我刚刚了解到ios_base::sync_with_stdio函数的存在,它基本上允许你关闭(或者如果你已经关闭它)iostream在C++中使用的cstdio流和作为标准C的一部分的流之间的同步.

现在,我一直认为stdout,stderrstdin用C基本上包裹在一组++的输入输出流类在C对象的.但如果它们必须彼此同步,这将表明C++的iostream不是 C stdin等的包装器 .

我很困惑这个?有人可以澄清C++的的iostream和C的标准输入输出是如何不同的东西,做同样的事情,只是在不同的抽象级别?我以为他们是一回事!

它们是如何同步的呢?我一直认为它们是同一个东西,一个包装另一个,基本上.

c c++ iostream stream cstdio

30
推荐指数
1
解决办法
1万
查看次数

使用cin跳过scanf()等预期字符

如何在C++中实现scanf("%d # %d",&a,&b);某种效果cin

c++ iostream scanf cin cstdio

5
推荐指数
1
解决办法
2626
查看次数

是否可以使 C++ iostream std::cout 与 cstdio printf() 一样高效?

注意:这不是现有std::ios::sync_with_stdio(false)问题的重复。我已经经历了所有这些,但我无法coutprintf. 示例代码和证据如下所示。

我有三个源代码文件:

// 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)

c++ synchronization iostream cstdio

5
推荐指数
0
解决办法
48
查看次数

<< s.str()和<< s.rdbuf()之间的区别

有人可以解释微妙的区别:

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()......

c++ iostream stringstream ofstream cstdio

4
推荐指数
1
解决办法
308
查看次数

当你不知道缓冲区大小时,如何避免危险的vsprintf

__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.

任何替代方案可以使上述功能更安全吗?

c static-analysis stdio cstdio

2
推荐指数
1
解决办法
2608
查看次数

为什么 sscanf 无法从一个字符串中读取 uint64_t 和 char?

#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

c++ char cstdint cstdio

1
推荐指数
1
解决办法
2683
查看次数

我无法理解为什么输出在这个for循环中变为10

任何人都可以清楚我的怀疑..为什么这个程序给出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++ loops for-loop cstdio

0
推荐指数
1
解决办法
60
查看次数

scanf()中%u和%d之间的差异

在C++中,如果我从一个字符串中读取一个整数,那么我是否使用ud作为转换说明符并不重要,因为它们都接受负整数.

#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)

Ideone.com

我挖得更深,发现是否有任何区别.我找到

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)

根据cppreference.com.

是否有任何差异之间的所有ud使用解析这些转换说明,即传递给格式时scanf …

c++ scanf cstdio

-1
推荐指数
1
解决办法
9112
查看次数