2009-12-03 4 views
2

Я пытаюсь ввести номер телефона в формате: 555-555-5555 в структуру с тремя int. Я пробовал использовать getline с разделителем «-», но я продолжаю получать ошибку: «невозможно преобразовать параметр 1 из« int »в« char * ».C++, получить номер телефона из txt-файла

Я попытался создать переменную temp char *, чтобы сохранить это число, а затем набирать его в int, но это не сработало.

Как мне это сделать?

Благодаря

редактировать:

вот часть кода:

void User::Input(istream& infile) { 

    char* phone_temp; 

    ... 

    infile.getline(phone_temp, sizeof(phoneNum.areaCode), "-"); 
    phoneNum.areaCode = (int)phone_temp; 

    ... 
} 
+3

Можете ли вы показать нам свой код? – phoebus

+0

Thats, вероятно, сбой. Вы не выделили память для phone_temp. –

ответ

4

Поскольку вы отправляете это как C++ вопрос, а не переменного тока вопрос, используйте istringstream http://www.cplusplus.com/reference/iostream/istringstream/

С моей голове это код стал бы что-то вроде:

std::string sPhoneNum("555-555-5555"); 
struct 
{ 
    int p1; 
    int p2; 
    int p3; 
} phone; 
char dummy; 

std::istringstream iss(sPhoneNum); 
iss >> phone.p1; // first part 
iss >> dummy; // '-' character 
iss >> phone.p2; // second part 
iss >> dummy; // '-' character 
iss >> phone.p2; // last part 

EDIT: теперь, вы отправили пример кода, я вижу, что вы уже начинаете с istream, вы можете просто использовать оператор >> напрямую, не нужно создавать другого оператора istringstream. Смотрите примеры: http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/

Кроме того, держаться подальше от методов преобразования с стилем с полукоксом * и atoi вещами, если вы не должны, работая с std::string и istreams «правильный» способ ++ C. Это позволяет избежать утечек памяти и других неприятных проблем.

+0

если у вас меньше, прокомментируйте, почему тоже. – catchmeifyoutry

1

, если я правильно понимаю, попробуйте atoi() или stringstream для преобразования из полукокса * до Int

1

См. Это example о том, как вы можете токенизировать линию. Этот question также поможет.

Затем используйте atoi для преобразования строки в int.

+0

Tokenizing это был бы лучший способ пойти imo. – ChadNC

0

Вы не можете наложить char* на номер int и ожидать правильного значения. A char* - это адрес в памяти, поэтому, когда вы передаете его int, вы получите адрес памяти в своем int. Вам необходимо вызвать функцию, такую ​​как atoi(), чтобы алгоритмически преобразовать данные. char* указывает на целое число.

0

вместо использования infile.getline() использовать свободно стоящий вариант с std::string:

getfile(infile, buffer); 

После этого, если вы хотите, вы можете сделать дополнение getline():

istringstream phonenumber(buiffer); 
string areacode = getline(phonenumber, part1. '-'); 

или вы можете использовать экстрактор >> (вот что он для!)

int areacode; 
phonenumber >> areacode; 

Просто обратите внимание: если вы используете char*, убедитесь, что вы выделили для этого место или по крайней мере указали на выделенное пространство.

2

Чтение номера телефона из потока:

Если предположить, что число хорошо отформатирован:

void User::Input(istream& infile) 
{  

    int part1; 
    int part2; 
    int part3; 
    char dash1; 
    char dash2; 

    infile >> part1 >> dash1 >> part2 >> dash2 >> part3; 

    /* 
    * !infile will return false if the file is in a bad state. 
    *   This will happen if it fails to read a number from 
    *   the input stream or the stream ran out of data. 
    * 
    * Both these conditions constitute an error as not all the values will 
    * be set correctly. Also check that the dash[12] hold the dash character. 
    * Otherwise there may be some other formatting problem. 
    */ 
    if ((!infile) || (dash1 != '-') || (dash2 != '-')) 
    { 
     throw int(5); // convert this to your own exception object. 
    } 
} 
0

Другой приемлемый вариант, хотя и не совсем C++, является:

char a[10],b[10],c[10]; 
scanf("%d-%d-%d", a, b, c); 
0

Оказывается вы пытаетесь преобразовать символ в целое число, и в этом случае вы хотите использовать функцию atoi или поток строк.