我找到了几个答案,但它们似乎与Windows机器有关.所以我的问题是管道和插座之间的区别是什么,何时/如何选择一个而不是另一个?
有人可以更明确地解释缓冲区的概念吗?我知道缓冲区是存储字符的数据结构,以及从中读取数据的位置.冲洗缓冲区的想法是什么?
刷新缓冲区时,这是指写入存储在其中的字符的行为吗?
从文字:
To avoid the overhead of writing in response to each output request, the library uses the
buffer to accumulate the characters to be written, and flushes the buffer, by writing its
contents to the output device, only when necessary. By doing so, it can combine several
output operations into a single write.
Run Code Online (Sandbox Code Playgroud)
当提到"刷新"时,几乎使其听起来好像缓冲区正在写入但同时也被擦除.只是猜测.
那么,为了写入屏幕上的视图需要缓冲区刷新?
When our program writes its prompt to cout, that output goes into the buffer associated
with the standard output stream. Next, we attempt …Run Code Online (Sandbox Code Playgroud) 可能重复:
C++:"std :: endl"vs"\n"
在Accelerated C++中,提到了两件事:
大多数系统花费大量时间将字符写入输出设备.因此,C++会累积要写入缓冲区的字符,并等待刷新缓冲区.
刷新缓冲区的一种方法是,如果我们通过使用明确告诉它这样做std::endl.
这使我想知道:很明显的好处是非常的一切小,不易察觉,除了最大的产出,但使用"\n"比使用速度更快std::endl,或者根本"\n"也刷新缓冲区?
我正在尝试用c ++试图找出如何尽可能快地打印从0到n的数字.
起初我只是用循环打印所有数字:
for (int i = 0; i < n; i++)
{
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为这会在输出的每一个数字之后刷新缓冲区,而且肯定需要一些时间,所以我试图先将所有数字打印到缓冲区(或实际上直到它已满,因为它似乎似乎自动刷新)然后立即冲洗它们.然而,似乎在刷新缓冲区之后打印\n就像std :: endl一样,所以我省略了它:
for (int i = 0; i < n; i++)
{
std::cout << i << ' ';
}
std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)
这似乎比第一个例子快10倍.但是我想知道如何将所有值存储在缓冲区中并一次刷新所有值,而不是每次充满时都让它冲洗,所以我有几个问题:
编辑:似乎我的结果偏向于滞后系统(智能手机的终端应用程序)......使用更快的系统,执行时间没有显着差异.
我正在尝试将cout命令转换为c ++中的getline命令.
这是我试图改变的代码....
for (int count=0; count < numberOfEmployees; count++)
{
cout << "Name: ";
cin >> employees[count].name;
cout << "Title: ";
cin >> employees[count].title;
cout << "SSNum: ";
cin >> employees[count].SSNum;
cout << "Salary: ";
cin >> employees[count].Salary;
cout << "Withholding Exemptions: ";
cin >> employees[count].Withholding_Exemptions;
}
Run Code Online (Sandbox Code Playgroud)
我正试图改变这一行:cin >> employees[count].name;这一行:cin >> employees[count].title;进入getlines.有人可以帮忙吗?
谢谢
我的程序打印了大量的短行cout.
作为一个有点人为的例子,我的线条看起来有点像这样:
cout<<"The variable's value is: "<<variable<<endl;
Run Code Online (Sandbox Code Playgroud)
我希望程序能够快速运行,我相信这会让我感到害怕,endl因为它会在cout每次使用时启动缓冲区刷新.
现在,互联网上的一些人说我可以这样做:
cout<<"The variable's value is: "<<variable<<"\n";
Run Code Online (Sandbox Code Playgroud)
但这似乎不是一个好的解决方案,因为endl抽象特定于系统的特定方式可以指定终止线,而\n不是.这似乎也是一个糟糕的解决方案,因为,如果我将来需要缓冲,那么我将不得不修改整个代码库.
因此,我问,有没有办法禁用缓冲区刷新方面endl?
编辑
进一步的挖掘似乎表明了两者endl并且\n尊重OS可能选择的各种方式来结束它的线条.似乎输出流检测它是否处于潜在的交互状态,并相应地缓冲和刷新.因此:问题可以通过手动告诉输出流执行积极缓冲来解决...如果我能弄清楚如何做到这一点.
我意识到输出是一样的.
情况1:
cout << "enter password " <<flush;
Run Code Online (Sandbox Code Playgroud)
案例2:
cout << "enter password " <<endl;
Run Code Online (Sandbox Code Playgroud) c++ ×6
buffer ×1
flush ×1
getline ×1
iostream ×1
networking ×1
newline ×1
optimization ×1
tcp ×1