我想我不完全理解指针,但为什么这里的输出有差异?

时间:2017-02-22 03:27:56

标签: c++ pointers

下面我有一段我的代码。基本上,我想知道为什么当我单独打印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循环打印时,我只是直接================

为什么会有区别?

3 个答案:

答案 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());
    */