2014-10-01 165 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