问题是我试图在ASCII之外打印一些字符,如德语变音字符,'ß'等.这些字符不适合普通的char变量,所以显然我试图将它们放在wchar_t中并用L"....."初始化字符串.但是每次这个字符串包含上面的字符时,我都会得到上面提到的错误,但是对于ASCII的所有其他字符它都没问题.这也发生在u"....",U"......",如果我使用u8"....."它不会产生错误但会打印垃圾.
那么问题:
请求示例:
#include <iostream>
#include <string>
using namespace std;
int main()
{
wstring x = L"öäüß" ;
wcout << x ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
这会打印错误.
#include <iostream>
#include <string>
#include <locale>
using namespace std;
int main(void)
{
setlocale(LC_ALL,""); // sets locale to german on my computer
string x = "äöüß" ;
cout << x ;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常.但即使在更改语言环境后,如果我创建第一个代码,也会生成错误.
注意:我注意到在C++(而不是C)中,即使没有包含除iostream之外的任何文件,也会声明其他文件的所有内容,如字符串或语言环境或标准库中的任何其他文件,并且在std命名空间中.我暂时忽略了这一点,仍然包含文档文件,但为什么会发生这种情况.(我使用的是tdm-gcc 64bit)
我很难理解缓冲的深度,特别是在C编程中,我已经在这个主题上搜索了很长时间,但直到现在还没有找到令人满意的东西.
我将更具体一点:我确实理解它背后的概念(即通过不同硬件设备协调操作并最大限度地降低这些设备的速度差异)但我希望对这些以及缓冲的其他潜在原因有更全面的解释. (并且完全是指越长越好越好)给出一些具体的I/O流中如何实现缓冲的例子也是非常好的.
其他问题是我注意到缓冲区刷新中的一些规则并不像我的程序那样奇怪,因为这听起来像下面的简单片段:
#include <stdio.h>
int main(void)
{
FILE * fp = fopen("hallo.txt", "w");
fputc('A', fp);
getchar();
fputc('A', fp);
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序旨在证明当第一个getchar()被调用时,即将发生的输入将立即刷新任意流,但这并不像我尝试的那样经常发生并且我想要的修改次数很多 - 它根本不会发生至于stdout(printf()例如)流被刷新而没有任何输入请求也否定了规则因此我是错误理解这个规则还是有其他需要考虑
我在Windows 8.1上使用Gnu GCC.
更新:
我忘了问我在一些网站上读过人们如何将字符串文字称为缓冲区甚至数组作为缓冲区; 这是正确的还是我错过了什么?请解释这一点.
简而言之
#include <iostream>
using namespace std ;
int main()
{
ios_base::fmtflags initial ;
cout << 10 << ' ' << 15.0 << '\n' ;
initial = cout.setf(ios_base::fixed);
cout << 10 << ' ' << 15.0 << '\n' ;
cout.setf(initial);
cout << 10 << ' ' << 15.0 << '\n' ;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码应生成以下输出:
10 15
10 15.000000
10 15
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.它产生的是:
10 15
10 15.000000
10 15.000000
Run Code Online (Sandbox Code Playgroud)
显然,调用setf并将initial作为其参数是不正确的.
有什么问题?