-1

Не работает reinterpret_cast. Мне нужно перевести два числа из файла в int, чтобы применить функцию, но последнего не выходит как раз таки. Числа на экран выводятся (в цикле), после с ними ничего не происходит. Как исправить? Срочно необходимо. Заранее спасибо!

#include <fstream>
using namespace std;

class MyList { public: struct Node { //структура узла int value; //значение в узле Node* next; //указатель на следующий узел }; MyList() { start = nullptr; //изначально список пустой, поэтому начальный и последний узлы заданы пустыми last = nullptr; } void Push(int val) { //функция, добавляющая элемент в конец списка if (start == nullptr) { start = new Node{val, nullptr}; last = start; } else { last->next = new Node{val, nullptr}; last = last->next; } } Node* Begin() { //метод, возвращающий указатель на начало списка, т.к. указатель на начальный узел под модификатором private return start; } void Print() { //функция печати данных в консоль auto start = Begin(); while (start != nullptr) { cout << start->value << " "; start = start->next; } cout << '\n'; } void ListSwap(int a, int b) { //функция поиска элементов с и замены их значений auto it_a = Begin(); for (int i = 0; i < a; ++i) { it_a = it_a->next; } auto it_b = Begin(); for (int i = 0; i < b; ++i) { it_b = it_b->next; } int temp = it_a->value; it_a->value = it_b->value; it_b->value = temp; }

private: Node* start; //указатель на начальный узел Node* last; //указатель на последний узел };

int main() { MyList my_list; my_list.Push(1); my_list.Push(2); my_list.Push(3); my_list.Push(4); my_list.Push(5);

my_list.Print();

int a, b;

ifstream inf(&quot;input.txt&quot;);    // чтение файла

if (!inf)
{
    cerr &lt;&lt; &quot;Uh oh, input.txt could not be opened for reading!&quot; &lt;&lt; endl;
    cin &gt;&gt; a &gt;&gt; b;
}

char buff[8][8];
while (inf)
{
    int i=0;
    while( !inf.eof() ) {                     // цикл, который существует пока не закончится файл
        inf.getline(buff[i],sizeof(buff));    // запись в buff строчки i файла
        cout &lt;&lt; buff[i];
    }
    i++;
}
inf.close();

while(!(cin&gt;&gt;a) || !(cin&gt;&gt;b))
{
    cin.clear();
    while(cin.get()!='\n')
        continue;
    cout&lt;&lt;&quot;Input error!&quot;;
}

int c = reinterpret_cast&lt;int&gt;(buff[0]);
int d = reinterpret_cast&lt;int&gt;(buff[1]);

cout&lt;&lt; c &lt;&lt; &quot; &quot; &lt;&lt; d;

if(!a || !b) {
    my_list.ListSwap(c, d);
}
else {
    my_list.ListSwap(a, b);
}
my_list.Print();

}

Gin Seng
  • 1
  • 3
  • Если вам нужно присвоить значение из buff[0] в int, так и присваивайте: int c = buff[0]. Зачем тут reinterpret_cast. И в char и в int - хранится число со знаком. – Optimus1 Nov 23 '21 at 13:06
  • Да, я изначально так и было, но в таком случае вылетало куча непонятных ошибок. – Gin Seng Nov 23 '21 at 13:07
  • 3
    вы решили не разбирается в "непонятных" ошибках и просто включили в код reinterpret_cast ? – Optimus1 Nov 23 '21 at 13:12

1 Answers1

1

Вы читаете строку

inf.getline(buff[i],sizeof(buff));

т.е. число в текстовом виде (в виде строки), а после этого преобразуете

int c = reinterpret_cast<int>(buff[0]);

адрес строки в число. Понимаете? Не число в строке, а ее адрес. действуйте ну хотя бы уж так:

int с = atoi(buff[0]);

Поскольку вы спрашиваете только о reinterpret_cast, остальной код не смотрел.

Но еще одно замечание сделаю — вот это

while( !inf.eof() )

неверно.

Harry
  • 221,325