读取TXT文件并将值放入列表中(c++)

read a txt file and put the values in a list (c++)

本文关键字:列表 c++ 文件 TXT 读取      更新时间:2023-10-16

文本文件中的值是这样的格式:

4  
2 3  
5 6  
3 7  
6 9  

和输出必须看起来像这样:

[2:3][5:6][3:7][6:9]  

这是我的代码:

#include <iostream>  
#include <stdio.h>  
using namespace std;  
class node {
    public:  
        int info;
        node* next;
        node(){
            next = NULL;
        }
        node (int value){
            info = value;
            next = NULL;
        }
};
class list {
    private:
        node* head;
    public: 
        list() {            //Constructor
            head = NULL;
        }
    void insert(int value){
        if (head == NULL){
            head = new node;
            head -> info = value;
            return;
        }
        node *temp = head;
        while (temp) {
            temp = temp -> next;
        }
        temp -> next = new node;
        temp -> info = value;
    }
    void showlist(){
        node* temp = head;
        temp = temp -> next;        //ignore first number in txt file
        cout << "Liste n" << endl;
        while (temp){
            printf ("%d", temp -> info);
            //cout << temp -> info << endl;
            temp = temp -> next;
        }
    }   
    ~list() {           //Destructor
        node* temp = head;
        while (head -> next != NULL) {
            delete temp -> next;
            temp -> next = NULL;
            temp = temp -> next;
        }
        delete head -> next;
        head -> next = NULL;
    }
};
int main(int argc, const char * argv[]) {
    list stone;
    FILE* fp;
    if (argc > 1)
        fp = fopen(argv[1], "r");
    else 
        fp = fopen("output.txt", "r");
    if (!fp)
        printf("Can't open file n");
    else {
        int value, state;
        int i = 0;
        do {
            state = fscanf(fp, "%d", &value);
            if (state != EOF){
                stone.insert(value);
            }
        stone.showlist();
        }
        while (state != EOF);
        fclose (fp);
    }
    return 0;
}

没有错误,但如果我想执行它,我得到了一个崩溃报告。

您的代码中有几个错误。我将列出几个明显的选项供您考虑:

  1. 你怎么处理?在显示列表时忽略头部,但它实际上保存了第一个值。
  2. 每次你尝试使用node->next时,你应该保证节点不是NULL
  3. 正如第一个答案所指出的,while循环后的温度为NULL。解可能为while (temp->next)
  4. 列表的析构函数不正确,空列表会遇到分段错误
  5. 您使用printffgets代替iostream,并且您使用两个类。你喜欢C还是c++ ?选择一个你喜欢的。

insert中的这个块看起来不正确:

    while (temp) {
        temp = temp -> next;
    }
    temp -> next = new node;

while循环之后,tempNULL,所以不能调用temp -> next

您似乎想要一个格式化的答案。但是你没有安排把它打印成

[2:3][5:6][3:7][完]

//THE MODIFICATIONS I MADE ARE MINUTE. BUT THEY'LL GIVE YOU THE RESULT YOU DESIRE.
// MODIFY TEXT FILE FOR ANY MORE INPUTS IF YOU NEED TO INSERT MORE
 #include <iostream>  
 #include <stdio.h>  
 #include<conio.h>
 using namespace std;  
class node {
public:  
    int info;
    node* next;
    node(){
        next = NULL;
    }
    node (int value){
        info = value;
        next = NULL;
    }
};
class list {
private:
    node* head;
public: 
    list() {            //Constructor
        head = NULL;
    }
void insert(int value){
    if (head == NULL){
        head = new node;
        head -> info = value;
        return;
    }
    node *temp = head;
    while (temp->next) { //MODIFIED INSERT LOOP TERMINATION CONDN
        temp = temp -> next;
    }
    temp -> next = new node;
    temp -> info = value;
}
void showlist(){
    node* temp = head;
  //  temp = temp -> next;  //ignore first number in txt file _ UNNECESSARY - COMMENTED
    cout << "List n" << endl;
    while (temp){
        if(!temp->next){break;} //, temp -> info,(temp -> next)-> info);
        else {printf ("[%d:%d]n", temp -> info,(temp -> next)-> info);}
        //cout << temp -> info << endl;
        temp = (temp -> next)->next;
    }
}   
~list() {           //Destructor
    node* temp = head;
    while (head -> next != NULL) {
        delete temp -> next;
        temp -> next = NULL;
        temp = temp -> next;
    }
    delete head -> next;
    head -> next = NULL;
}
};
int main(int argc, const char * argv[]) {
list stone;
FILE* fp;
if (argc > 1)
    fp = fopen(argv[1], "r");
else 
    fp = fopen("inp.txt", "r"); //CHANGED NAME OF FILE 
if (!fp)
    printf("Can't open file n");
else {
    int value, state;
    int i = 0;
    do {
        state = fscanf(fp, "%d", &value);
        if (state != EOF){
            stone.insert(value);
        }
    } while (state != EOF);
     stone.showlist();
    fclose (fp);
}
getch();
return 0;
}