1. 程式人生 > >C/C++對檔案以及標準輸入(stdin)、輸出(stdout)操作的格式設定

C/C++對檔案以及標準輸入(stdin)、輸出(stdout)操作的格式設定

背景:在編寫一個軟體與Chrome中外掛進行通訊,由Chrome中的外掛自動抓捕到網頁資訊,從而呼叫C++編寫的程式,之間通過標準的輸入輸出進行通訊(資料格式為json檔案)。Chrome中抓捕資訊的特點是前4個位元組作為整個後段內容資料的長度,因此在傳送資料到Chrome時,必須是長度(4個位元組)+資料段,外不能加任何無效欄位,不然會出現通訊異常

出現的現象:在一臺電腦上,當程式傳送資料給Chrome時,這時Chrome會主動斷掉應用程式,其他兩臺電腦則正常使用

問題:在使用標準輸入輸出時,用的fread、fwrite沒有進行任何的格式設定(分為二進位制、文字格式),而此時預設採用的是文字格式,當採用文字格式寫入時,則資料段末尾會自動增加/a表示結束,因此Chrome中以為/a是下一個資料來了,,進行解析,亦發現沒有資料,格式異常,因此斷開了與應用程式的連結。二進位制格式則不一樣,資料不會進行任何的更改、新增,達到我們的效果

控制對文字、標準輸入、輸出格式的函式:setmode

示例:

/* SETMODE.C: This program uses _setmode to change
 * stdin from text mode to binary mode.
 */
#include <stdio.h>
#include <fcntl.h>
#include <io.h>


void main( void )
{
   int result;


   /* Set "stdin" to have binary mode: */
   result = _setmode( _fileno( stdin ), _O_BINARY );   // O_TEXT


   if( result == -1 )
      perror( "Cannot set mode" );
   else
      printf( "'stdin' successfully changed to binary mode\n" );
}

MSDN連結:https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa298581(v=vs.60)