2016-04-29 4 views
-2
struct node 
{ 
string info; 
struct node *next; 
}*start, *last; 

long nodecount=0; 
class teditor 
{ 
public: 
    node* create_node(string); 
    void insert_pos(); 
    void save(); 
    void display(); 
    void delete_pos(); 
    teditor() 
    { 
     start = NULL; 
    } 
}; 
node *teditor::create_node(string value) 
{ 
struct node *temp, *s; 
temp = new(struct node); 
if (temp == NULL) 
{ 
    cout<<"Memory not allocated "<<endl; 
    return 0; 
} 
else 
{ 
    temp->info = value; 
    temp->next = NULL;  
    return temp; 
} 
} 
void teditor::save() 
{ 
struct node *info; 
ofstream listfile; 
listfile.open("example.txt",ios::out|ios::app |ios::binary) ; 
node *temp; 
temp=start; 
if(!listfile){ 
cout<<"\nError"; 
} 
else{ 
while(temp!=NULL) 
{ 
    listfile.write((char*)(temp),sizeof(nodecount)); 
    temp=temp->next; 
} 
} 
listfile.close(); 
cout<<"\n\n\n\t\tLink list has been saved in file example.txt in current folder."; 
cout<<"\n\n\t\tPress a key to continue ... ";getch(); 
} 
void teditor::insert_pos() 
{ 
string value; int counter; 
int pos; 
cout<<"Enter the value to be inserted: "; 
cin>>value; 
struct node *temp, *s, *ptr; 
temp = create_node(value); 
cout<<"Enter the postion at which node to be inserted: "; 
cin>>pos; 
nodecount++; 
int i; 
s = start; 
while (s != NULL) 
{ 
    s = s->next; counter++; 
} 
if (pos == 1) 
{ 
    if (start == NULL) 
    { 
     start = temp; 
     start->next = NULL; 
    } 
    else 
    { 
     ptr = start; 
     start = temp; 
     start->next = ptr; 
    } 
} 
else if (pos > 1) 
{ 
    s = start; 
    for (i = 1; i < pos; i++) 
    { 
     ptr = s; 
     s = s->next; 
    } 
    ptr->next = temp; 
    temp->next = s; 
} 
else 
{ 
    cout<<"Positon out of range"<<endl; 
} 
} 

void teditor::display() 
{ 
/* 
Need to merge as a string and show to display just in one line like writing 
why cannot save health because of application saving pointers. 
*/ 
node *temp; 
temp=start; 
cout<<"\n\n\n"; 
while(temp) 
{ 
    cout<<"\t\t\t"<<temp->info; 
    temp=temp->next; 
} 
cout<<"\n\n\t\t "<<nodecount<<" records displayed ,Press a key to continue.....";getch(); 
} 
void teditor::delete_pos() 
{ 
int pos, i, counter = 0; 
if (start == NULL) 
{ 
    cout<<"List is empty"<<endl; 
    return; 
} 
cout<<"Enter the position of value to be deleted: "; 
cin>>pos; 
struct node *s, *ptr; 
s = start; 
if (pos == 1) 
{ 
    start = s->next; 
} 
else 
{ 
    while (s != NULL) 
    { 
     s = s->next; 
    } 
    if (pos > 0 && pos <= counter) 
    { 
     s = start; 
     for (i = 1;i < pos;i++) 
     { 
      ptr = s; 
      s = s->next; 
     } 
     ptr->next = s->next; 
    } 
    else 
    { 
     cout<<"Position out of range"<<endl; 
    } 
    free(s); 
}cout<<s<<" Element Deleted"<<endl;nodecount--; 
cout<<"There is left "<<nodecount<<" nodes"<<endl; 

    } 

Hallo, Jungs! Ich habe ein Problem, während ich versuche, meine Liste zu txt.Everytime speichern ich tryin und txt gab mir ein chinesisches writing.Teacher sagte auch, ich brauche Um mit String zu fusionieren oder ich muss Knoten geben, um diese Anwendung zu streichen, kann diese Schnurzeile leicht speichern. Vielleicht weil ich versuche, node *temp zu schreiben. Jeder weiß, wie ich mein Problem lösen kann? Nach anderen Prozessen wird es Kopie, Schnitt sein , Einfügen und Ersetzen durch Knoten.Schreiben verknüpfte Liste zu TXT-Datei (Speicher Prozess)

+0

Wo ist Ihr 'main()'? Konnte Ihr Problem nicht reproduzieren. –

+0

in main() 'teditor sl; Start = NULL; und ich benutzte switch: case, dass ich leicht aufrufen kann sl.save(); ' –

+0

Wo" startest du "deine verknüpfte Liste' node'? 'start' sollte nicht NULL sein, sollte es irgendwo sein' = * node; ' –

Antwort

0

ändern

listfile.write((char*)(temp),sizeof(nodecount)); 

zu

listfile << temp->info; 
+0

Ich habe versucht, aber txt zeigt mir immer noch chiness schreiben. –

0

Sie den Zeiger nicht temp in Ihre Dateien schreiben wollte, wollte man die info, die innerhalb der node ist, dass temp an zeigt. Warum schreiben Sie dann temp anstatt die info zu schreiben? Du könntest das "durch" deinen Zeiger tun temp, richtig?

Die unter den oben für Sie tun:

listfile << temp->info; 
+0

aber immer noch die gleiche Sache Ich habe Fehler gemacht, während ich Zeichenfolge in die verkettete Liste einfügen. –

+0

@ BahadırSoybakış das ist das einzige, was ich mir vorstellen kann, wenn Sie immer noch Müll bekommen. Versuchen Sie, den Code einzufügen, der die Liste in der Frage – vu1p3n0x

+0

@bahad Post ein [MCVE] enthält, oder Sie müssten _step-in_ Ihre Codeanweisung durch Anweisung, um Ihre Logik und die Werte jeder Variablen zu beobachten. –

0

ok, haben Sie eine Serialisierung Problem. Sie möchten Text in der Datei. Aber Sie entleeren einfach Speicher in die Datei.

listfile.write((char*)(temp),sizeof(nodecount)); 

schreibt nur den rohen Speicher eines Knotens.

Fragen Sie sich - wie soll die Textdatei aussehen? Wie sieht es in einem Editor aus? Dann musst du Code schreiben, um das zu tun.

Sie brauchen

listfile << temp->info 

zu tun, wie Sie die nächste und vor speichern wollen. Vielleicht ist es in der Bestellung enthalten. SO ist das alles was du brauchst. Vielleicht müssen Sie Zeilennummern ans sagen next=4, prior=14

+0

[link] (http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c) zeigt diese Serialisierung. Ich denke, wie du sagst, ich muss eine Variable definieren, um sich zu beziehen. @ Pm100 –

-2

Ihr Problem nachdem ich diese Schritte werden gelöst werden:

  1. Rechtsklick auf den Namen Projekt, gehen Sie zu Eigenschaften
  2. Allgemein -> Projektvorgaben -> Zeichensatz
  3. Wählen Sie nicht