C ++通过Char将文件读入字符串;崩溃

时间:2017-05-05 04:16:09

标签: c++ string char

当我一次读取一个文本文件然后将该字符发送到一个字符串(这是一个字符数组)时,它似乎正常工作,输出显示正确但是它崩溃了。为什么呢?

次要问题:它似乎没有为字符串添加空格(这是一个字符数组)。为什么呢?

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <cctype>
using namespace std;

int main()
{
    int SIZE = 0;

    char text;  
    string textArray;

    fstream inFile("text.txt"); //opens text.txt

    //checks if file was opened
    if (!inFile)
    {
        cout << "Error opening the file.\n";
        return 0;
    }

    //reads each character then adds the character to the array
    while (inFile >> text)
    {
        //if you coment out line 46 and 47 the program wont crash
        textArray[SIZE] = text; //comment out // doesnt add white spaces 
        cout << textArray[SIZE]; //comment out // the output form this is the text.txt but no white spaces
        SIZE++;
    }
    inFile.close(); //closes text.txt

    cout << SIZE; //output the size of the array

    return 0;
}

4 个答案:

答案 0 :(得分:2)

  

当我一次读取一个文本文件然后将该字符发送到一个字符串(这是一个字符数组)时,它似乎正常工作,输出显示正确但是它崩溃了。为什么呢?

它现在正常运作的原因是因为运气。默认构造

string textArray;

是空的。实现可以为字符输入保留一些空间,但不必这样做。如果你想将字符推送到你从流中读取的每个字符的字符串末尾,你可以这样做:

while (inFile >> text)
{
    cout << text;
    textArray += text;
}

然后输出字符串的大小,使用:

cout << textArray.size();
  

它似乎不会在字符串中添加空格(这是一个字符数组)。为什么呢?

这是因为C ++流读取文本的方式。当输入流通过

读入字符或字符串时
myInputStream >> myChar;

myInputStream >> myString;

它可以跳过任何前导空格,然后它会为你提供你得到的字符或字符串。这由流标志std::ios_base::skipws控制。要禁用此行为,请调用:

inFile.unsetf(std::ios_base::skipws);
// OR
inFile >> std::noskipws;

要重新启用此行为,请致电:

inFile.setf(std::ios_base::skipws);
// OR
inFile >> std::skipws;

答案 1 :(得分:1)

textArray[SIZE] = text;

当字符串的大小小于或等于SIZE时,写入位置SIZE是未定义的行为。

追加角色的一种正确方法是:

textArray.push_back(text);

您根本不需要SIZE变量。字符串的大小可以从textArray.size()获得。

答案 2 :(得分:0)

  它崩溃了。为什么呢?

您尝试访问不属于该字符串的地址:

textArray[SIZE] = text;      SIZE++;

您可以使用std::string.push_back(char c)

  

它似乎没有为字符串添加空格(这是一个字符数组)。为什么呢?

尝试:

fStreamVar >> std::noskipws;
打开文件后立即

答案 3 :(得分:0)

感谢所有回复中的所有人,以下是我正在寻找的解决方案。

while (inFile >> std::noskipws >> text)

textArray += text;

我现在明白为什么它正在做它正在做的事情。非常感谢!我的问题是我刚刚完成了使用int的数组并切换到字符和字符串使我的大脑变形。

全部谢谢!