请问各位高手Linu下 c++宽字符的宽流和wcin/out和 cin/out的问题

qq_34204674 2017-12-06 12:07:00
我这段程序在linux下(部分代码)
char order;

cin >> order;
int s;
if (order == 'd')
{
s = getchar();//linux下加不加这个都一样,后面一样是会死机。
NewDiary(ds);
break;
}
然后跳转到日记添加模块
do {
cout << "请输入日记标题:(不超过15个中文或英文字符,回车结束输入)" << endl;
getline(wcin, name, L'\n');//1
if (name.length() > 15) cout << "长度错误,请重新输入!" << endl;
} while (name.length() > 15);
int line = -1;
wstring text = L"";
wchar_t x = L' ';
cout << "请输入日记内容:(回车换行,输入#代表日记结尾):" << endl;
while (x != L'#')
{
getline(wcin, temp, L'\n');//2

其中第一个getline没有被执行 直接被跳过了 直接执行第二个,然后第二个执行的时候直接就死机了,整个系统直接卡死死机。每次都是直接卡死。
我程序是在windows下用vs写的 windows下能完美运行。windows下 开始的时候没有s=getchar()这一句,第一个getline会被直接跳过,因为回车残留在缓冲区中(但是我很好奇,我的回车是cin的时候输入的,宽流遇到窄字符下的回车也会终止吗,难道宽流win和cin公用一个缓冲区?,我没有管了,反正加了个getchar()第一个getline就能正确读取),所以我加了个getchar()能够正常运行。
然而我在linux下 就不行了,加了getchar(不加效果也一样)第一个getline还是会被忽略,运行结果就是 输入 d 回车后直接显示
"请输入日记标题:(不超过15个中文或英文字符,回车结束输入)"
"请输入日记内容:(回车换行,输入#代表日记结尾)"
然后过几秒就卡死了 整个系统卡死!
我也尝试过自己测试 我一度认为是输入缓存区有残留 所以第一个getline不请求从键盘获取数据 直接从缓冲区读。于是我编写了一个小程序测试
代码类似于
char a;
cin>>a;
wcin.imbue(locale(""));//指定宽字符编码
wstring x;
int x;
while(x=getchar()!=EOF)
cout<<x;
我想测试下是不是缓存区没清空
然后这个程序就无限循环输出-1-1--1
始终getchar不请求键盘输入
意思是这个程序缓冲区有无穷多的数据?我查了下-1是代表getchar()失败,getchar()怎么会失败?
难道不应该是getchar缓冲区清空完后再请求键盘输入吗?
----------------------------------------------------------------------------------------------
我又搜到一种方案是加上ios_base::sync_with_stdio(false); 查了下意思就是
{决定C++标准streams(cin,cout,cerr...)是否与相应的C标准程序库文件(stdin,stdout,stderr)同步,也就是是否使用相同的stream缓冲区,缺省情况是同步的,但由于同步会带来某些不必要的负担,因此该函数作用就是我们自己可以取消同步 std::ios::sync_with_stdio(false); }
我开始觉得不恰当 因为我的是cin和wcin的关系, 与stdio没多大关系,但是加了这段代码后,再把getchar()换成 cin.get()程序能够正确读入了。 但是又出现了新问题,有一些屏幕上莫名的输出语句出现在不该出现的地方。给我的感觉就像是输出混乱。
---------------------------------------------------------------------------------------------------
所以我想问问各位大佬怎么写代码第一个getline正确读入并且输出不混乱呀?上面说的所有问题windows下都没有,就是linux感觉他的cin 和wcin cout和wcout是不是有点不一样?。
我的程序是cin和wcin cout和wcout语句都有的。想法是一个日记本 标题和内容用宽字符 wcin wcout 因为涉及到中文,最后要存到文件中。其他的不涉及中文存储的就用普通的字符cin wcin .。我感觉是不是wcin和cin混用导致了混乱???

---------------------------------
超级感谢各位大佬,这个问题我调试七八个小时了 ,还是没法!!!!晚上也搜不到!!!!csdn的大神们 求求你们救救我吧~!~!~!!!




...全文
389 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklinux 2017-12-10
  • 打赏
  • 举报
回复
有点看不明, getline(wcin, name, L'\n'), 但在linux上getline函数是这样的: ssize_t getline(char **lineptr, size_t *n, FILE *stream);

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧