许多C++书籍都包含这样的示例代码......
std::cout << "Test line" << std::endl;
Run Code Online (Sandbox Code Playgroud)
......所以我也一直这样做.但我已经看到很多来自像这样的开发人员的代码:
std::cout << "Test line\n";
Run Code Online (Sandbox Code Playgroud)
是否有技术上的理由偏爱另一个,或者仅仅是编码风格的问题?
我听到一些人表达了对std :: string中"+"运算符的担忧以及加速连接的各种变通方法.这些都真的有必要吗?如果是这样,在C++中连接字符串的最佳方法是什么?
istreambuf_iterator和之间有什么区别istream_iterator?一般来说,stream和streambufs有什么区别?我真的找不到任何明确的解释,所以决定在这里问.
我正在研究一个简单的解析器,在进行分析时我发现瓶颈在...文件读取!我摘录了非常简单的测试来比较的性能fstreams和FILE*读取数据的大斑点时:
#include <stdio.h>
#include <chrono>
#include <fstream>
#include <iostream>
#include <functional>
void measure(const std::string& test, std::function<void()> function)
{
auto start_time = std::chrono::high_resolution_clock::now();
function();
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - start_time);
std::cout<<test<<" "<<static_cast<double>(duration.count()) * 0.000001<<" ms"<<std::endl;
}
#define BUFFER_SIZE (1024 * 1024 * 1024)
int main(int argc, const char * argv[])
{
auto buffer = new char[BUFFER_SIZE];
memset(buffer, 123, BUFFER_SIZE);
measure("FILE* write", [buffer]()
{
FILE* file = fopen("test_file_write", "wb");
fwrite(buffer, 1, BUFFER_SIZE, file);
fclose(file);
});
measure("FILE* read", [buffer]() …Run Code Online (Sandbox Code Playgroud) 在与我的团队中新来的开发人员讨论之后,我意识到在C++中仍然存在使用C构造的习惯,因为它们应该更好(即更快,更精简,更漂亮,选择你的理由).
与类似的C++构造相比,有哪些示例值得共享,显示C构造?
对于每个示例,我需要阅读C++构造与原始C构造一样好或甚至更好的原因.目的是提供一些在C++代码中被认为有些危险/不安全的C构造的替代方案(C++ 0x只有在只有明确标记为C++ 0x的情况下才能接受答案).
我将在答案(结构内联初始化)下面作为示例发布.
注1:请每个案例一个答案.如果您有多个案例,请发布多个答案
注2:这不是C问题.不要在此问题中添加"C"标签. 这不应该成为C++和C之间的斗争.只研究C++的C子集的一些结构,以及它们在其他C++"工具包"中的替代方案.
注3:这不是一个抨击C的问题.我想要理由.吹嘘,抨击和未经证实的比较将被下调.提及没有C等价物的C++特性可以被认为是不可能的主题:我希望并排放置一个针对C++特性的C特征.
我正在帮助某人提出有关在C中输出的问题,而我无法回答这个看似简单的问题我想用答案(在我的回答中),即:
在C/C++中输出文件的最快方法是什么?
我使用C++和Java完成了素数生成和数学算法优化的大量工作,这对我来说有时是最大的劫持 - 我有时需要移动很多文件并且速度很快.
请原谅我,如果这已经得到回答,但我一直在寻找google和SO一段时间无济于事.
我不希望有人做基准测试的工作 - 但有几种方法可以存档,我怀疑我知道这一切.
总结一下,
有什么方法可以用C和C++输出到文件?
哪些是更快的?
显然从控制台重定向是非常糟糕的.任何简单的比较printf,cout,fputc,等会有所帮助.
编辑:
从评论中,
cout和printf有一个很好的基线测试: 混合cout和printf以获得更快的输出
这是一个很好的开始,但不是我要问的最佳答案.例如,它不处理评论中提到的std :: ostreambuf_iterator <>,如果这是可能的话.它也不处理fputc或提到控制台重定向(相比之下有多糟糕)(不是它需要)
编辑2:
此外,为了争论我的历史案例,你可以假设输出几乎无限量的数据(程序在较新的英特尔i7上运行数天,产生千兆字节的文本)
临时存储在这里只是非常有用 - 你不能轻易地缓冲千兆字节的数据.
再会,
我编写了一个 Java 程序,它使用 Process 对象和 Runtime.exec() 函数调用启动多个 C++ 编写的程序。C++ 程序使用 cout 和 cin 作为它们的输入和输出。Java 程序从 C++ 程序的输入流和输出流中发送信息和读取信息。
然后我有一个字符串缓冲区,它通过将 C++ 程序的输入和输出附加到字符串缓冲区来构建程序的典型交互。问题是所有输入调用都被追加,然后所有输出调用都被发布。例如,StringBuffer 的实例可能是这样的......
2
3
Please enter two numbers to add. Your result is 5
Run Code Online (Sandbox Code Playgroud)
当程序在标准控制台上看起来像这样
Please enter two numbers to add. 2
3
Your result is 5
Run Code Online (Sandbox Code Playgroud)
问题是我得到了输入和输出的顺序,因为除非 C++ 程序调用 cout.flush() 函数,否则在给出输入之前不会写入输出。
有没有办法自动刷新缓冲区,这样 C++ 程序就不必担心调用 cout.flush()?类似于 C++ 程序是一个与命令控制台交互的独立程序,程序员并不总是需要 cout.flush(),命令控制台仍然在输入之前输出数据。
谢谢,
我想知道为什么会一直这样...... !! 我在c中编写了两个程序,在c ++中编写了另一个程序.两者都执行相同的操作.即打印1到2000000之间的数字.此外,我在执行开始时设置计时器..并且在打印之后还打印所有经过的时间.c ++程序所用的时间总是大于交流程序.我觉得时间差异很大.我很想知道这是什么原因.. ???? ..
这是两个程序
//iotest.c
#include<stdio.h>
#include<time.h>
clock_t start=clock();
int main()
{
for(int i=0;i<2000000;i++)
printf("%d\n",i);
printf("Time Elapsed: %f\n",((double)clock()-start)/CLOCKS_PER_SEC);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
//iotest.cpp
#include<iostream>
#include<time.h>
using namespace std;
clock_t start=clock();
int main()
{
for(int i=0;i<2000000;i++)
cout<<i<<endl;
cout<<"Time elapsed "<<((double)clock()-start)/CLOCKS_PER_SEC<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
// ver C++ 4.3.2通过发出命令编译c程序
g ++ iotest.c
执行给出
1
.
.
2000000
经过的时间:5.410000(并不总是相同..)
执行第二个程序
1
.
.
2000000
时间流逝:5.81(并非总是相同..)
我是编程的新手,我昨天开始自学,我已经得到了所有东西,但老实说,我不明白它们之间的区别
std::cout << x;
Run Code Online (Sandbox Code Playgroud)
和
std::cout << x << std::endl;
Run Code Online (Sandbox Code Playgroud)
没有人向我解释这一点,我要求保持安全.
可能重复:
混合cout和printf以获得更快的输出
我正在使用Microsoft Visual Studio 6.0.
以下程序,
#include "stdafx.h"
#include "iostream.h"
int main(int argc, char* argv[])
{
printf("a");
printf("b");
printf("c");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产生"abc".
而以下方案,
#include "stdafx.h"
#include "iostream.h"
int main(int argc, char* argv[])
{
printf("a");
cout<<"b";
printf("c");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
产生"acb".
有什么问题?我不能在同一个程序中混合使用cout和printf吗?
可能重复:
在C++ cin或printf中printf vs cout
?
我一直想知道printf和cout ..哪一个最终更快,并且它也是最灵活的(即可以打印一系列变量,输出可以格式化)?
PS我知道这看起来类似于C++中的'printf'和'cout',但我并不是真的在问同样的事情.
我正在尝试将一个char数组转换为一个数组std::string,但我只能在数据中得到喋喋不休std::string.怎么了?
char char_buff[40];
sprintf_s(char_buff, 40, "test" );
printf("%s\n", char_buff); // prints "test"
std::string str(char_buff);
printf("%s\n", str); // prints random nonsense
Run Code Online (Sandbox Code Playgroud) 我试图用C++编写代码,从文件读取,一系列点,将其存储在动态数组中,然后打印回来.
这是我给出的规范:
"我们希望利用我们可以使用动态内存的事实,因此我们不是根据我们的估计在开始时分配足够大的内存量,而是实现以下算法:
最初,分配的内存非常少.
在循环的每次迭代中(从文件读取并存储到动态数组中),我们跟踪:
当由于新插入而导致元素数量大于数组最大大小时,内存重新分配需要按如下方式进行:
从我下面的代码中,我认为其他一切都很好但是最后一个要求,即在数组末尾添加新项目.
当数组Max_Size超过文件的元素数时,代码工作正常,但是当我尝试扩展num_elements时,结果是文件中的额外数字只保存为零
.
另外,分配还不允许使用向量.对不起,我忘了提这个,我是stackoverflow的新手,有点编程.
请帮忙
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
struct point {
double x;
double y;
};
int main () {
ifstream inputfile;
inputfile.open("datainput.txt");
if(!inputfile.is_open()){
cout << "could not open file" << endl;
exit(EXIT_FAILURE);
}
//initially very little memory is allocated
int Max_Size = 10;
int num_elements = 0;
point *pp = new point[Max_Size];
//read from file and store in dynamic array …Run Code Online (Sandbox Code Playgroud) c++ arrays algorithm memory-management dynamic-memory-allocation