2017-02-22 6 views
0

Ниже у меня есть фрагмент кода. В принципе, мне интересно, почему существует разница в выходе, когда я отдельно печатаю contextFile[0] и contextFile[1] против цикла for.Я думаю, что я не совсем понимаю указатели, но почему здесь разница в выходах?

В contextfile.txt (это значение target_file_name в данном случае), я следующее:

гикори Dickory точка была маленькая ферма вы чувствуете меня.

Вот код:

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, я просто получаю прямо ================.

Почему существует разница?

ответ

1

Поскольку печати

cout << contextFile[count]; 

снова и снова, вместо

cout << contextFile[i]; 

в цикле, что приводит к неопределенному поведению, так как contextFile[count] никогда не был инициализирован.

+0

Только что проверил код снова и мое понимание - есть попытка прочитать final 'contextFile [count]', но на EOF это будет - ну, [моя ссылка не говорит] (http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/) - возможно быть неустановленным, но по крайней мере не полезным значением, поэтому мой (теперь удаленный) комментарий неверен. –

0

Это потому, что вы печатаете только одно значение внутри цикла for.

for (int i = 0; i < count; i++) { 
    cout << contextFile[count]; 
} 

Вам необходимо внести изменения в этот

for (int i = 0; i < count; i++) { 
    cout << contextFile[i]; 
} 
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()); 
    */