2017-02-12 23 views
0

我一直在用這一段時間撞擊牆壁,我只是試圖製作一個簡單的應用程序來讀出文件的內容。下面是一些代碼:std :: wcout在一定數量的字符後將不會打印

errno_t error; 
if ((error = fopen_s(&f, file, "r")) == 0) { 
    while (true) { 
     std::wcout << std::endl << "NEW RUN" << std::endl; 
     wchar_t content[4096]; 
     if (fgetswc(content, 4096, f) == 4096) { 
      std::wcout << content; 
      std::wcout.flush(); 
     } 
     else { 
      std::wcout << content; 
      std::wcout.flush(); 
      break; 
     } 
    } 
    fclose(f); 
    std::wcout << "PLEASE PRINT THIS NOW"; 
    system("pause"); 
    return 0; 
} 

而定製fgetswc功能:

int fgetswc(wchar_t buffer[], int count, FILE * f) { 
    for (int i = 0; i < count; i = i + 1) { 
     wchar_t c = fgetwc(f); 
     if (c != WEOF) { 
      buffer[i] = c; 
     } else { 
      return i; 
     } 
    } 
    return count; 
} 

它讀取第一個4096個字節出來的文件,但隨後後續std::wcout調用不會打印到控制檯我有。它讀取文件的其餘部分併成功結束,因爲我可以看到使用斷點和調試器。每次迭代都會填滿content。我也嘗試加入調試語句,但是即使那些不打印。我只是做錯了什麼?據我所知,我的文件中沒有特殊字符,它只是一個日誌文件。

回答

1
std::wcout << content; 

這實際上是調用std::wostream::operator<<(const wchar_t *)。它不知道content不是一個以''結尾的字符串。事實上,它不可能知道它在第一種情況下的有效長度爲4096,在第二種情況下它的有效數量較少(不保存返回值fgetswc)。

+0

我不知道'std :: wcout'需要被換行符終止,因爲我可以執行'std :: wcout <<「great」;'沒有任何'std :: endl'。我想它只是穿過char數組,然後繼續。我仍然不明白爲什麼它不會繼續,因爲我知道第一次穿過肯定有4096個字符。 – duper51

+1

@ duper51語法'「偉大的''產生一個6元素的字符數組,其中包含一個終止NUL。你如何期待'std :: wcout <<'知道在哪裏停止打印呢?如果你傳遞一個'wstring',那麼它有一個已知的長度,如果你傳遞一個'wchar_t *'它取決於找到一個NUL字符。 – ephemient

+0

啊,有趣。 – duper51