Компактная запись указателя для открытия файлов - PullRequest
0 голосов
/ 04 марта 2010

Я пишу программу для открытия нескольких файлов, указанных в командной строке. Сначала я сделал это с помощью записи массива. Это похоже на работу. Сейчас я пытаюсь использовать компактные обозначения указателей для практики и привыкать к указателям, но я делаю это неправильно Кто-нибудь хочет сказать мне, что я делаю не так? Спасибо.

#include <cstdlib>
#include <fstream>
#include <iostream>
using namespace std;

ifstream *OpenFiles(char * const fileNames[], size_t count)
{   
    ifstream *fileObj = new ifstream[count];

    if (fileObj == NULL) {
        cerr << "Failed to create space for files";
        exit(EXIT_FAILURE); 
    }

//  working loop with array notation
//  for (int loopCount = 0; loopCount < (int) count; loopCount++) {
//      fileObj[loopCount].open(fileNames[loopCount], ios::out);
//      if (fileObj[loopCount].is_open()) {
//          cout << "Opened " << fileNames[loopCount] << "\n";  
//      }
//
//  }

// start compact pointer notation that doesn't work
    ifstream *start, *end;

    for (start = fileObj; start < end; start++) {
        start.open(fileNames, ios::out);
        if (start.is_open()) {
            cout << "Opened " << start << "\n";
        }
    }
    return fileObj;
}

Ответы [ 2 ]

1 голос
/ 04 марта 2010

end не инициализируется, поэтому, является ли start < end истиной / ложью, зависит от того, какие случайные данные остались в стеке.Вы должны инициализировать конец с:

end = fileObj + count;
0 голосов
/ 04 марта 2010

Вы должны разыменовать свои указатели или использовать стрелку вместо точки. Кроме того, вы должны выбрать имя файла, который хотите открыть:

ifstream *end = fileObj + count;
for (ifstream *start = fileObj; start < end; start++) {
    start->open(fileNames[start-fileObj], ios::out);
    if (start->is_open()) {
        cout << "Opened " << fileNames[start-fileObj] << "\n";
    }
}
return fileObj;

На мой взгляд, в этом случае лучше использовать обозначение массива.

...