Помогите перевести char в int

В общем был недавно на олимпиаде. Нужно было чтоб все программы читали input.in и записывали результат в output.out. В input.in находится 5 чисел длиной до 2 символов (цифры типа integer). Считывается хорошо, все числа выводятся нормально :

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream input_file("[путь до]input.in") ;
char one[2], two[2], three[2],four[2],five[2];
input_file >> one;
input_file >> two;
input_file >> three;
input_file >> four;
input_file >>five;
cout << one << endl;
cout << two << endl;
cout << three << endl;
cout << four << endl;
cout << five << endl;
}

Но вот если хочу вести с ними какие то вычисления выскакивают непонятные значения, к примеру 174648468. Потом понял что char нужно перевести int. Пытался так :

int a;
a = (int) one;

Норм руководства по itoa всяким не нашёл, да и судя по отзывам на форумах оно то особо и не помогает.
Как перевести эти char'ы в int ? Или я с самого начала неправильно считываю.

Кажется стоит избавиться от [2 ] в char n ? Написал на андрюше прогу и в диагностике пишет что квадратные скобки нужны только для string.

Ahmasoft, можно посмотреть содержимое input.in? Твоё описание очень нечёткое ((

Ahmasoft, прекрасный input.in! Читай как 5 переменных типа int и будет тебе щастье :))

Кстати, двухсимвольная строка в C/C++ занимает три ячейки массива типа char. Это так, на будущее.

чар и так «целочисленный», подсмотрел фишку на киберфоруме, парни чтоб откорректировать «вес» цифры, вычитают значение нуля по ASCII т.е. как бы обнуляют числовую прямую (в аски цифры не с начала представлены) и получается надо посимвольно с соблюдением разрядности цикл организовать.

Vangua, char — по определению целочисленный, в отличие от типов чисел с плавающей точкой. Но char и int — это разные типы. Как правило, они отличаются разрядностью.

Для преобразования С-строки в int конечно можно написать собственную функцию, однако лучше воспользоваться стандартной atoi() (см. описание).

atoi выручил. :-)

char b;
int a = atoi(b);

И ещё один вопрос, когда я сначала объявил int а :

int a;
char b;
a = atoi(b);

Visual ругался, почему ?

Может из-за того что переменная b не была инициализирована, т.е. там был какой-то хлам, с которым atoi не работает, а в первом случае просто повезло и в области памяти b попалось корректное для atoi значение???

Ahmasoft, попроводил опыты с atoi(). Он ругается когда не указан размер массива char[], и неважно где int a.

int a;
char b;
a = atoi(b); // ошибка: аргумент типа "char" не совместим с параметрами типа "const char*"



int a;
char b[10]; // размер массива указан - ошибки нет
a = atoi(b);

Также ещё возник вопрос с чтением. К примеру в первой строке входного файла input.in числа : n m d.
Во второйвторой строке другие числа : k a b. Пробовал считывать методом описанным выше, но ругается. Как организовать считывание по строкам и пожалуйста немного поподробнее ( просто могу так сказать « не врубиться » ).

Ahmasoft, а так читать не судьба?

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int n, m, d, k, a, b;
    ifstream input_file("input.in");
    if (input_file) {
        input_file >> n >> m >> d >> k >> a >> b;
        cout <<
            n << ' ' <<
            m << ' ' <<
            d << ' ' << endl <<
            k << ' ' <<
            a << ' ' <<
            b << endl;
    }
    else {
        cerr << "File not found." << endl;
    }
}

Так ведь кол-во переменных может меняться. Это я примерный input.in задал.

Ну и Cranium тебе примерный код написал ;-)
Считывать можно в цикле в одну переменную, или в элементы массива. Это как тебе нужно. Фишка в том, что используется не посимвольное и не строковое считывание из потока, а в переменную типа int. Т.е. вся головная боль по преобразованию из символов в целое переносится на стандартную библиотеку.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.