为什么我的管道在写入之间插入了额外的空间?

时间:2016-11-16 23:39:42

标签: c++ winapi io

我有以下简单的程序。它回声直到它收到一个孤独的<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.me.MyActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/appbar_padding_top" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <android.support.v7.widget.SearchView android:id="@+id/internalSearchView" app:queryHint="To..." android:layout_weight="1" android:layout_width="match_parent" android:layout_height="wrap_content" > </android.support.v7.widget.SearchView> </LinearLayout> </android.support.v7.widget.Toolbar> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="?attr/actionBarSize" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </android.support.design.widget.CoordinatorLayout> 。然后退出。

q

当我自己启动程序时,它按预期工作。但是,如果我从另一个程序启动它并使用匿名管道两次写入stdin,我会在第二次写入的内容前面加上一个额外的空格。

手动运行

// quitOnQ.cpp int main() { string line; while (line != "q") { cout << line << endl; getline(cin, line); } return 0 } - &gt; &#34; J&#34;

j<enter> - &gt; [节目结束]

Piped stdin A(成功)

q<enter> - &gt; [节目结束]

Piped stdin B(成功)

q\n - &gt; [节目结束]

Piped stdin C(失败)

j\nq\n - &gt; &#34; J&#34;

j\n - &gt; &#34; Q&#34; [程序保持开放,注意额外的空间]

为什么会这样?

以下是我用来写入stdin的代码:

q\n

2 个答案:

答案 0 :(得分:4)

问题是您错误地使用了sizeof()。编译器将char字符串文字视为以空值终止的const char[]数组。在字符串文字上调用sizeof()包括大小的空终结符sizeof("j\n")是3,而不是像你期望的那样2。那个空终结符是你额外空间的来源。您应该使用strlen()代替:

WriteFile(hWriteIN, "j\n", strlen("j\n"), &dwWritten, NULL);
WriteFile(hWriteIN, "q\n", strlen("q\n"), &dwWritten, NULL);

话虽如此,你应该改变你的阅读循环:

int main()
{
    string line;
    while (getline(cin, line))
    {
        if (line == "q") break;
        cout << line << endl;
    }  
    return 0
}

并且不要忘记关闭CreateProcess()返回的句柄:

CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);

答案 1 :(得分:1)

sizeof("j\n")将返回字符串+ 1的长度,因为它以null结尾。这个额外的空间将是空字符。