2012-03-01 75 views
7

讀取字符的具體數額我試圖做這樣如何從文本文件

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char b[2]; 
    ifstream f("prad.txt"); 
    f>>b ; 
    cout <<b; 
    return 0; 
} 

它應顯示爲2個字符,但它讀取整條生產線。這工作在另一種語言,但由於某種原因在C++中不起作用。

+0

+1和「Thank you」提供一個簡短的完整樣本程序。 http://sscce.org – 2012-03-01 15:15:15

+4

「這工作在另一種語言,但出於某種原因在C++中不起作用。」這是您在編程中可能做出的最糟糕的假設之一。他們是兩種不同的語言,所以他們可以有不同的行爲。 – PlasmaHH 2012-03-01 15:16:42

+0

是的,圍繞這個想法很危險。如果你是從Java來的C++(這是你從錯誤中看到的),你確實需要坐下來閱讀一些指針和數組,並確保你在拍攝自己的腳之前瞭解發生了什麼。 – zmccord 2012-03-01 15:20:27

回答

8

您可以使用read()指定的字符數爲:從流並將它們存儲爲一個C字符串

char b[3] = ""; 
ifstream f("prad.txt"); 

f.read(b, sizeof(b) - 1); // Read one less that sizeof(b) to ensure null 
cout << b;    // terminated for use with cout. 
+1

爲了使'3'和'2'之間的關係更加明顯,我建議使用一個命名常量。 'size_t const BufferSize = 2;','char b [BufferSize + 1] =「」;'和'f.read(b,BufferSize);' – 2012-03-01 15:53:16

+0

@MatthieuM,我通常會使用'sizeof(b) - 1 '(如果可能的話)。代碼已更新。 – hmjd 2012-03-01 15:56:13

+0

我總是不願推薦這個,因爲如果'b'是一個指針,那麼編譯仍然可以在64位平臺上得到一個固定的'7'。你可以使用'size'函數來設置數組,但模板很簡單。 – 2012-03-01 16:11:59

0
istream& get (char* s, streamsize n); 

提取字符到 數組在s開始。提取字符,直到(n - 1)個字符被提取或定界字符'\ n'爲 找到。如果在 輸入序列中到達文件末尾,或者在輸入操作期間發生錯誤,則提取也會停止。如果找到了 ,則會找到分隔字符,但不會從輸入 序列中提取它,並保留爲要提取的下一個字符。如果您希望提取(並放棄)此角色,請使用 getline。 用於表示C字符串結尾的結尾空字符是 ,它自動附加在存儲在s中的內容末尾。

2

這個工作對另一種語言,但在C++不工作一段 原因。

有些事情從語言變爲語言。特別是在這種情況下,你已經違反了C++指針和數組幾乎不同的事實。該數組被傳遞給operator >>作爲指向char的指針,該指針被解釋爲字符串指針,因此它對char緩衝區做了什麼(直到寬度限制或行結束,以先到者爲準)。你的程序應該在發生這種情況時會崩潰,因爲你正在溢出緩衝區。