Сделал класс SelectTable. Метод ReadFileToArray() - открывает текстовый файл и считывает в | Код | unsigned long int *array |
целые числа. Далее с помощью метода | Код | My.ReturnElementByIndex<unsigned long int>(2, My.ReturnFirstOfArray() ); |
- вывожу например 2-ой элемент массива. С этим нет проблем.
Но когда использую тип std::string в методе | Код | ReturnElementByIndex() |
:
| Код | My.ReadFileName("C:\\Name.txt"); My.ReturnElementByIndex<std::string>(0, My.ReturnFirstOfFName() );
|
чтобы считать из текстового файла Name.txt имена файлов, то компилятор указывает мне на ошибку в методе:
| Код | // Метод возвращает элемент массива *array по индексу. template <class T> SelectTable::ReturnElementByIndex(unsigned long int index, T *UserArray) { if (index>=0 && index<n) { return UserArray[index]; } else return -1; } |
в строке
| Код | if (index>=0 && index<n) { return UserArray[index]; } |
"нельзя конвертировать STL::string в int".
| Код | //---------------------------------------------------------------------------
#include <fstream> // Потоковый ввод-вывод в файл, std::ifstream File(FileName); #include <string> // std::string *array
//---------------------------------------------------------------------------
class SelectTable {
private: // Метод подсчета количества строк в файле. signed long int StringCount (char* FileName);
unsigned long int *array;
unsigned long int n;
std::string *FName;
public:
// Конструктор класса. SelectTable (void);
// Деструктор класса. ~SelectTable (void);
// Конструктор копирования. SelectTable(const SelectTable &T);
// Метод считывает весь файл в массив. void ReadFileToArray(char* FileName);
// Метод возвращает элемент массива *array по индексу. template <class T> ReturnElementByIndex(unsigned long int index, T *UserArray);
// Метод считывает в массив типа std::string* имена файлов, void ReadFileName(char* FileName);
// Возвращает 1-ый элемент массива *array. unsigned long int *ReturnFirstOfArray();
// Возвращает 1-ый элемент массива *FName. std::string *SelectTable::ReturnFirstOfFName();
};
//---------------------------------------------------------------------------
// Метод подсчета количества строк в файле. // Функция возвращает знаковый целый тип: // -1 - в случае ошибки открытия файла, // или количество строк в файле. signed long int SelectTable::StringCount (char* FileName) {
std::string str;
// Переменная для хранения количества строк. signed long int String_Counter = 0;
// Чтение файла. std::ifstream File(FileName);
// Вовзратить -1, если ошибка чтения файла. if( File.fail() ) return -1;
while( !File.eof() ) { getline(File, str); String_Counter++; };
return String_Counter;
}
//---------------------------------------------------------------------------
// Конструктор класса. SelectTable::SelectTable(void):n(0), array(NULL), FName(NULL) { }
//---------------------------------------------------------------------------
// Деструктор класса. SelectTable::~SelectTable(void) { if(n) delete []array; if(FName) delete []FName; }
//---------------------------------------------------------------------------
// Конструктор копирования. SelectTable::SelectTable(const SelectTable &T) {
if(T.array){ array = new unsigned long int [T.n]; n = T.n; FName = T.FName; } }
//---------------------------------------------------------------------------
// Метод считывает файл в массив типа unsigned long int* . void SelectTable::ReadFileToArray(char* FileName){
// Если в файле есть хотя бы одна строка, // то выделить память. if (StringCount(FileName) > 0) { n=StringCount(FileName); array = new unsigned long int [n]; std::string str; // Чтение файла std::ifstream File(FileName);
unsigned long int i=0;
// Пока нет конца файла. while( !File.eof() ) { getline(File, str); array[i++] = atol( str.c_str() ); }; } }
//---------------------------------------------------------------------------
// Метод возвращает элемент массива *array по индексу. template <class T> SelectTable::ReturnElementByIndex(unsigned long int index, T *UserArray) { if (index>=0 && index<n) { return UserArray[index]; } else return -1; }
//---------------------------------------------------------------------------
// Метод считывает в массив типа std::string* имена файлов, void SelectTable::ReadFileName(char* FileName){
std::string str;
std::ifstream File(FileName);
if( !File.fail() ) { FName = new std::string [ StringCount(FileName) ];
unsigned long int i=0;
while( !File.eof() ) { getline(File, str); FName[i++] = str; };
} }
//---------------------------------------------------------------------------
// Возвращает 1-ый элемент массива *array.
unsigned long int *SelectTable::ReturnFirstOfArray() { return array; }
//---------------------------------------------------------------------------
// Возвращает 1-ый элемент массива *FName.
std::string *SelectTable::ReturnFirstOfFName() { return FName; }
//---------------------------------------------------------------------------
int main() {
SelectTable My;
// Нормально работает:
My.ReadFileToArray("C:\\1.txt"); ShowMessage( My.ReturnElementByIndex<unsigned long int>(0, My.ReturnFirstOfArray() ) );
My.ReadFileName("C:\\Name.txt"); ShowMessage( My.ReturnElementByIndex<std::string>(0, My.ReturnFirstOfFName() ) );
return 0;
} //---------------------------------------------------------------------------
|
Добавлено через 3 минуты и 28 секунд В чем ошибка ? |