Я хочу прочитать 3-ю строку из текстового файла в виде string
, преобразовать ее в long long int
и вернуть это значение.
Данные на третьей строке текстового файла: 1234567890123456
long long int File::Getline3(int user1, int user3)
{
std::string filename = std::to_string(user1);
std::ifstream fin(filename + ".txt");
fin.getline (line1, 5);
fin.getline (line2, 5);
fin.getline (line3, 20);
fin.close();
// convert line 3 to a string called str
const char *line3;
std::string str(line3);
// convert str to long long int called user3
long long int strtoll(const char *nptr, char **endptr, int base);
char* endptr = NULL;
user3 = strtoll(str.c_str(), &endptr, 10);
return user3;
}
Комментарии в том, чтобы показать, что я думаю, что я делаю, однако я, вероятно, ошибаюсь (я новичок в указателях).
Когда я пытаюсь создать свою программу, я получаю "нерешенную внешнюю" ошибку.
long long int strtoll(const char *nptr, char **endptr, int base);
Эта строка объявляет функцию. Это означает, что когда вы вызываете strtoll
на несколько строк вниз, вы будете называть эту функцию наиболее очевидным кандидатом. Однако вы никогда не определяли его.
Вместо этого вы намеревались вызвать std::strtoll
, который определен (стандартной библиотекой) и который будет найден через вашу предполагаемую директиву using namespace std
если вы не скрываете ее, ложно объявляя эту несуществующую функцию самостоятельно одно и то же имя. :)
Просто удалите излишнюю декларацию:
// convert str to long long int called user3
char* endptr = NULL;
user3 = strtoll(str.c_str(), &endptr, 10);
У вас есть аналогичная проблема с вашим const char* line3
, который вы объявляете внутри функции, никогда не присваиваете ничего, а затем создаете строку из. Это не определено; указатель не инициализирован. Предполагая, что у вас есть элемент данных line3
(вместе с вашей line1
и line2
), снова вы скрываете его с локальной переменной с тем же именем.
Наконец, передача user3
по значению совершенно бессмысленно, если вы просто пишете и возвращаете его. Удалите этот параметр.
Объединив все это, ваш код должен выглядеть так:
// convert line3 to long long int
char* endptr = NULL;
return strtoll(line3, &endptr, 10);
Короче говоря, будьте меньше декларации-счастливы!
long long int File::Getline3(int user1)
{
std::string filename = std::to_string(user1);
std::ifstream fin(filename + ".txt");
std::string line1, line2; // place to actually store the lines
getline(fin, line1); // read a line
getline(fin, line2); // read another line
long long int number_on_line_3; // somewhere to store the number
fin >> number_on_line3; // store the number
fin.close();
return number_on_line_3; // return the number
}
Работа для Visual C++, в которой нет этих включений.