下面我有一段我的代码。基本上,我想知道为什么当我单独打印contextFile[0]
和contextFile[1]
而不是for
循环时,输出会有所不同。
在contextfile.txt
中(在这种情况下,这是target_file_name
的值),我有以下内容:
hickory dickory dot有一个你觉得我的小农场。
以下是代码:
cin >> target_file_name;
ifstream fileExist(target_file_name);
if (fileExist)
{
int count = 0;
int contextSize = 1000;
int keySize = 1000;
char *contextFile;
char *keyFile;
contextFile = new char[contextSize];
keyFile = new char[keySize];
string command;
fileExist >> contextFile[count];
while (!fileExist.fail())
{
count++;
fileExist >> contextFile[count];
}
cout << "printing individual: " << contextFile[0] << contextFile[1];
cout << "Printing the contextfile array: " << endl;
for (int i = 0; i < count; i++)
{
cout << contextFile[count];
}
当我单独打印时,我得到hi
,这是正确的输出。
当我通过for
循环打印时,我只是直接================
。
为什么会有区别?
答案 0 :(得分:1)
因为你打印
cout << contextFile[count];
一遍又一遍,而不是
cout << contextFile[i];
在循环中,导致未定义的行为,因为contextFile[count]
从未初始化。
答案 1 :(得分:0)
这是因为您只在for
循环中打印一个值。
for (int i = 0; i < count; i++) {
cout << contextFile[count];
}
您需要对其进行更改
for (int i = 0; i < count; i++) {
cout << contextFile[i];
}
答案 2 :(得分:0)
您的输入文件中包含50个字符。因此,在您的阅读循环结束后,count
为50,contextFile[0]
最多并包括contextFile[49]
已填充数据。
然后您输出contextFile[]
的前两个单独字符,这很好。
然后你在count
的第一个contextFile[]
字符中运行一个循环,这也很好。但是在每次循环迭代中,您输出的contextFile[50]
都没有填充任何有效数据。您应该输出contextFile[i]
代替:
for (int i = 0; i < count; i++)
{
//cout << contextFile[count];
std::cout << contextFile[i];
}
话虽如此,我建议不要使用char[]
:
std::getline(std::cin, target_file_name);
std::ifstream theFile(target_file_name);
if (theFile)
{
std::vector<char> contextFile;
char ch;
theFile.seekg(0, std::ios_base::end);
size_t size = theFile.tellg();
theFile.seekg(0, std::ios_base::beg);
contextFile.reserve(size);
while (theFile >> ch)
{
contextFile.push_back(ch);
}
/* alternatively:
contextFile.reserve(size);
std::copy(
std::istream_iterator<char>(theFile),
std::istream_iterator<char>(),
std::back_inserter(contextFile)
);
*/
/* alternatively:
contextFile.resize(size);
theFile.read(&contextFile[0], size);
size = theFile.gcount();
contextFile.resize(size);
*/
std::cout << "printing individual: " << contextFile[0] << contextFile[1]" << std::endl;
std::cout << "Printing the contextfile array: " << std::endl;
for (int i = 0; i < contextFile.size(); i++)
{
std::cout << contextFile[i];
}
/* alternatively:
for (std::vector<char>::iterator iter = contextFile.begin(); iter != contextFile.end(); ++iter)
{
std::cout << *iter;
}
*/
/* alternatively:
std::copy(
contextFile.begin(),
contextFile.end(),
std::ostream_iterator<char>(std::cout)
);
*/
/* alternatively:
std::cout.write(&contextFile[0], contextFile.size());
*/