2014-10-01 220 views
-1

有一個問題,我想幫助。這是怎麼一回事呢:C++從文件中讀取不正確

我用下面的代碼閱讀一定量的字符爲字符數組後處理:

char str[15]; // first 16 characters that i need to get from file 

    std::ifstream fin("example.txt"); 
    if(fin.is_open()){ 
     std::cout<<"File opened successfully \n"; 
     for(int i = 0; i<=15; i++) 
     { 
      fin.get(str[i]); //reading one character from file to array 

     } 

    } 
    else{ 
     std::cout<<"Failed to open file"; 
    } 


    std::cout<<str; 

它工作正常,前4甚至5個字符,但是當它達到8時,它開始打印垃圾字符。

example.txt文件的內容,我從中讀取文本。

The Quick Brown Fox Jumped Over The Lazy Dog The Quick Brown Fox Jumped Over The Lazy Dog 

輸出,當我讀8個字:

The Quic�j� 

輸出,當我讀到16個字符:

The Quick Brown ASCII 

這究竟是爲什麼,在哪裏了 'ASCII' 來的時候我嘗試從文件中讀取一定的長度?

最後,如果我想從文件中獲取特定長度,應該使用哪種代碼?例如,如果我想讀取前4或8或16甚至20個字符?它不一定必須存入char數組,它可以被保存爲一個字符串。

預先感謝您。

+2

您需要在從文件中讀取最後一個字符後放置一個'\ 0'字符。 – 2014-10-01 09:11:58

+0

std :: string line; getline(鰭,線); std :: cout << line; //快速布朗狐狸跳過懶惰的狗快速布朗狐狸跳過懶惰的狗 – Jagannath 2014-10-01 09:12:08

+0

您的char數組需要更大或者您的循環需要<15且不是<= 15。C++是從零到n - 1爲數組索引。 – 2014-10-01 09:13:23

回答

1

你的char數組只有15個字符長。所以這條線去出界:

for(int i = 0; i<=15; i++) 

如果i等於15那是太多了,因爲你的數組數從014

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 < =數它們!

15地方開始014

結束此外,當字符串存儲在內存中,他們必須以空字符'\0'被終止。否則,打印它們的函數不知道何時停止,這可能是垃圾的來源。

因此,因爲空終止符將佔用您的15空格之一,所以您只能從14中讀取文件。

所以:

 for(int i = 0; i < 14; i++) 
    { 
     fin.get(str[i]); //reading 14 characters (0-13) 
    } 
    str[14] = '\0'; // add the string terminator at the end of the array. 

看看是否能工程。

+0

哦,是的!無效終結者,我怎麼能忘記?我是一個血腥的白癡。謝謝你的答案 – Alighieri 2014-10-01 18:25:22