Linkedlist 와 파일 입출력 질문있습니다.

juhyun16의 이미지

안녕하세요, 학교 숙제하는 도중 잘 안되어서 글을 올려봅니다.

어떤 내용이냐 하면 dictionary.txt 파일에서 영어단어만 추출을 하여서 그것들을 linked list로 단어들을 저장해놓습니다.
이어서 연결리스트에 의해 저장되어 있는 단어들을 output 텍스트 파일을 만들어서 파일에다가 출력하는 과제입니다.

그런데 읽어들이는 txt 파일에서 단어들이 어떤 형식으로 저장되어 있냐하면

c language/씨언어
algorithm/알고리즘
communication/통신

뭐 이런식으로 영어단어(or 숙어)가 먼저 나오고 이어서 항상 / (슬래쉬)가 나옵니다 그리고 뜻이 적혀져 있어요.

먼저 슬래쉬 앞 까지 영어단어만 추출하여서 연결리스트에 저장해야합니다.
제가 어디까지 구현하였냐하면 / (슬래쉬)를 기준으로 단어를 추출하는 것 까지 하였고, 연결리스트로 저장하는 것 까지 하였습니다.

그런데 dictionary.txt. 파일에 매우 많은 단어가 저장되어 있습니다. 대략 보았을 때 단어가 1만단어? 정도 될 듯 하네요. 그래서 이 것을 아무생각없이 연결리스트로 저장시키려하다가 메모리주소 참조 오류가 떴습니다. 아마 Heap 엉역에서 할당 가능한 범위, 영역을 넘어서서 한 번에 저 많은 단어들이 연결리스트 형태로 저장이 안되나 봐요.

그래서 #define 상수를 하나 만들어서 20개씩 나누어서 저장하고 출력하고 저장하고 출력하고 반복하려고 하는데요 여기서 문제가 발생하였습니다.

define 상수를 만들어서 20개씩 저장하려고 하면 20개가 저장되고 21번째에서 문제가 발생합니다.
만약 define 상수를 30으로 하면 30개 까지 저장되고 31번째에서 에러가 발생하구요....
숫자를 아주 작에 5로 가정하면 5개까지는 저장하고 출력되는데 6번째에서 딱 막히네요...

이건 무슨 문제인것이죠??? 제 코드를 한번 검토해주실 수 있나요??
계속 해보다가 잘 안되는데요....... 이걸 재귀함수로 구현해야 하나요??? 잘 모르겠습니다. ㅠ

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
using namespace std;
 
#define TWENTY 20
char stringtemp[30];
char Temp[30];
int num = 0;
 
class Node
{
public:
	char str[20];
	Node *Next;
	Node()
	{ Next = NULL; }
	Node(char* my_str)
	{
		strcpy(str, my_str);
		Next = NULL;
	}
};
 
class Head
{
public:
	Node *Header;
	Head() { Header = NULL; }
	Head(Node *my_next)
	{
		Header = NULL;
		Insert(my_next);
	}
	void Insert(Node *my_next)
	{
		if (Header == NULL) { Header = my_next; }
		else
		{
			Node *temp;
			for (Node *ptr = Header; ptr != NULL; ptr = ptr->Next)
			{
				temp = ptr;
			}
 
			temp->Next = my_next;
		}
	}
	void ShowData()
	{
		for (Node *ptr = Header; ptr != NULL; ptr = ptr->Next)
		{
			static int INDEX = 1;
			cout << INDEX++ << ". => " << ptr->str << endl;
		}
	}
	void My_Delete()
	{
		Node *current = Header;
		Node *beforeCurrent = NULL;
		for (;;)
		{
			beforeCurrent = current;
			current = current->Next;
			if (current->Next == NULL)
			{ 
				delete beforeCurrent;
				delete current;
				return;
			}
			delete beforeCurrent;
		}
	}
};
 
int main()
{
	FILE *fp = fopen("Dictionary1.txt", "r");
	int ch, i=0;
	Head *HeadList = new Head();
	Node *inputNode;
	/* fopen 불가능 예외처리 */
 
 	while (1)
	{
		ch = fgetc(fp);
		if (ch == EOF) break;
 
		if (ch == '/')
		{
			stringtemp[i++] = '\0'; // '/' 문자가 탐지되면 NULL 문자 강제대입함.
			strcpy(Temp, stringtemp);
 
			/* '/' 이후에 문자들 읽어들이기만 한다. 개행문자 만나면 while문 빠져나감. */
			while (1)
			{
				ch = fgetc(fp);
				if (ch == 10) break;
			}
 
			inputNode = new Node(Temp);
			HeadList->Insert(inputNode);
			i = 0;
			num++;
 
			if (num == TWENTY)
			{
				HeadList->ShowData();
				HeadList->My_Delete();
				num = 0;
				i = 0;
			}
			continue;
		}
		stringtemp[i++] = ch;
	}
 
	return 0;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.