当我一次读取一个文本文件然后将该字符发送到一个字符串(这是一个字符数组)时,它似乎正常工作,输出显示正确但是它崩溃了。为什么呢?
次要问题:它似乎没有为字符串添加空格(这是一个字符数组)。为什么呢?
#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;
}
答案 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的数组并切换到字符和字符串使我的大脑变形。
全部谢谢!