Member 13784265 Ответов: 2

Я работал над связанным списком и пытался прочитать строку из файла и сохранить ее в узле.


в последнее время я пытаюсь прочитать каждую строку(слово) из файла "file.txt" сохранено в той же папке проекта с некоторыми именами в нем.вот код, который я сделал.что на самом деле пытаюсь сделать, это пытаться прочитать каждое слово из файла и хранить каждое слово в каждом узле и для следующего слова,новый узел будет создан, и он будет хранить слово в нем и продолжается до конца файла.но когда он достигнет точки "темп-&ГТ;следующий = глава" программа завершает работу.любая идея, как я могу получить его фиксированной.

Что я уже пробовал:

#include<iostream>
		#include<stdio.h>
		#include<iomanip>
		#include<conio.h>
		#include<string>
		#include<fstream>

		using namespace std;

		struct node
		{
			string data;
			node* next;
		};

		int main()
		{
			ifstream fout;

			node *head = NULL;
			string name;
			int  counter = 1;

			fout.open("file.txt");
			if (fout.is_open())
			{
				while (getline(fout, name))
				{
					cout << "Inserting at data." << endl;
					cout << "enter the data = " << name;
					node *temp;
					temp = (node*)malloc(sizeof(node));
					head = temp;
					temp->data = name;
					temp->next = head;
					cout << "DATA ENTERED." << endl;
					cout << "NUMBER OF ELEMENTS = " << counter++ << endl;
				}
			}

			_getch();
		}

2 Ответов

Рейтинг:
2

OriginalGriff

Хм.
Посмотрите, что делает ваш код:

node *temp;
temp = (node*)malloc(sizeof(node));
Объявите темп и установите его на новый узел.
head = temp;
Установите головку на новый узел.
temp->data = name;
Сохранить данные.
temp->next = head;
Установите next узел в голове - который теперь тот же самый узел!
Поэтому каждый раз, когда вы создаете новый узел, вы отбрасываете предыдущий узел, и вы всегда будете иметь круговой список из одного узла!

Это не та проблема, которую вы заметили, но она повлияет на вас довольно скоро.
Что касается того, что вы заметили: мы не можем запустить его при тех же обстоятельствах - у нас нет доступа к вашему файлу. Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Member 13784265

я пытался this.it он работает над компилятором cfree, но когда я переключаюсь на Visual Studio, Visual Studio выдает ошибки.
ОШИБКИ:
ни один оператор ">>"не соответствует этим операндам в строке 22.
ни один оператор "<<"не соответствует этим операндам в строке 43.

#include<iostream>
#включить<fstream>
#включить<conio.h>

использование пространства имен std;

структурный узел
{
строковое имя;
узел *далее;
};

тап_п()
{
node *head = NULL;
узел *хвост;
плавник ifstream;
fin.open("naeem.txt");
строковая информация;
в то время как (!fin.eof())
{
fin >> Информация;
узел *temp = новый узел;
temp->next = NULL;
если (!голова)
{
temp->name = информация;
хвост = голова = температура;
}
еще
{
temp->name = информация;
хвост->next = temp;
хвост = температура;
}
}

узел *t = головка;
int count = 1;

while (t != NULL)
{
соиь <&ЛТ; "[" &ЛТ;&ЛТ; граф &ЛТ;&ЛТ; "]=&ГТ;" &ЛТ;&ЛТ; т-и GT;имя << епси;
t = t->Далее;
считать++;
}
_getch();
}

Рейтинг:
0

CPallini

Я бы сделал класс списка для обработки взаимодействия элементов и очистки памяти. Например

#include <iostream>
#include <fstream>
using namespace std;

struct Node
{
  Node( const string & name ):name(name),next(nullptr){}
  string name;
  Node * next;
};

class List
{
  Node * head;
public:
  List():head(nullptr){}
  ~List();
  void add(const string & name);
  friend ostream & operator << (ostream & os, const List & l);
private:
  void delete_last();
};

void List::delete_last()
{
  Node * cur = head;
  if ( ! cur ) return;
  if ( ! cur->next )
  {
    delete cur;
    head = nullptr;
    return;
  }

  while ( cur->next->next )
  {
    cur = cur->next;
  }
  delete (cur->next);
  cur->next = nullptr;
}

List::~List()
{
  while ( head )
    delete_last();
}
void List::add( const string & name)
{
  if ( ! head )
  {
    head = new Node(name);
    return;
  }

  Node * cur = head;

  while ( cur->next )
    cur = cur->next;

  cur->next = new Node(name);
}

ostream & operator << (ostream & os, const List & l)
{
  Node * cur = l.head;
  while (cur)
  {
    os << " " << cur->name;
    cur = cur->next;
  }
  return os;
}

int main()
{
  List l;
  string name;

  ifstream ifs("file.txt");

  while ( getline( ifs, name) )
  {
    l.add( name );
  }

  cout << l << endl;
}


Пожалуйста, обратите внимание: Делайте это только в качестве упражнения для связанных списков. В реальном приложении, использующем vector, было бы гораздо лучше:
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
  vector <string> v;
  ifstream ifs("file.txt");
  string name;

  while ( getline(ifs, name) )
    v.push_back(name);

  for ( const  auto & s : v)
    cout << s << " ";

  cout << endl;
}


Member 13784265

я пытался this.it он работает над компилятором cfree, но когда я переключаюсь на Visual Studio, Visual Studio выдает ошибки.
ОШИБКИ:
ни один оператор ">>"не соответствует этим операндам в строке 22.
ни один оператор "<<"не соответствует этим операндам в строке 43.

#include<iostream>
#включить<fstream>
#включить<conio.h>

использование пространства имен std;

структурный узел
{
строковое имя;
узел *далее;
};

тап_п()
{
node *head = NULL;
узел *хвост;
плавник ifstream;
fin.open("naeem.txt");
строковая информация;
в то время как (!fin.eof())
{
fin >> Информация;
узел *temp = новый узел;
temp->next = NULL;
если (!голова)
{
temp->name = информация;
хвост = голова = температура;
}
еще
{
temp->name = информация;
хвост->next = temp;
хвост = температура;
}
}

узел *t = головка;
int count = 1;

while (t != NULL)
{
соиь <&ЛТ; "[" &ЛТ;&ЛТ; граф &ЛТ;&ЛТ; "]=&ГТ;" &ЛТ;&ЛТ; т-и GT;имя << епси;
t = t->Далее;
считать++;
}
_getch();
}