簡體   English   中英

從文件讀取后輸出奇怪

[英]Strange output after reading from a file

使用此代碼,以下執行會產生奇怪的結果:

C 100
R
W

文本文件的第一行定義了要從中讀取的元素數量,它包含一些小於15的值,但是每次我運行該文件時,數組中的第一個值始終打印為87('W的ASCII值')。 如果將“ W”功能更改為“ X”,則數組中的第一個結果為88。

#include <iostream>
#include <fstream>

using namespace std; 

int arrayLength;

class ELEMENT
{
    public:
        int key;
};

class HEAP
{
    public:
        int capacity;
        int size;
        ELEMENT H [];
};

HEAP initialize(int n)
{
    HEAP h;
    h.capacity = n;
    h.size = 0;
    return h;
}

void buildHeap(HEAP &h, ELEMENT *a)
{
    h.size = arrayLength;
    for (int i = 1; i <= arrayLength; i++)
    {
        h.H[i] = a[i];
    }

    for (int i = h.size/2; i >= 1; i--)
    {
        // HEAPIFY HERE
    }
}

void printHeap(HEAP &h)
{
    cout << "Capacity:\t" << h.capacity << endl;
    cout << "Size:\t\t" << h.size << endl;
    cout << "|";
    for (int i = 1; i <= h.size; i++)
    {
        cout << " ";
        cout << h.H[i].key << " |";
    }
    cout << endl;
}

int main()
{
    char c;
    int val;
    HEAP h;

    while (c != 'S')
    {
        cin >> c;
        switch (c)
        {
            case 'S':
                break;
            case 'C':
                cin >> val;
                h = initialize(val);
                break;
            case 'W':
                printHeap(h);
                break;
            case 'R':
                {
                    ifstream infile;
                    infile.open("HEAPinput.txt");
                    infile >> arrayLength;
                    ELEMENT* a = new ELEMENT[arrayLength];
                    for (int i = 1; i <= arrayLength; i++)
                        infile >> a[i].key;
                    infile.close();
                    buildHeap(h, a);
                }
                break;
        }
    }

    return 0;
}

它正在Unix服務器上使用g ++進行編譯。

編輯:要澄清:具有以下內容的文本文件(空格=新行):

12 9 10 11 12 8 7 6 5 4 3 2 1

輸出為:

Capacity: 100

Size: 12

| 87 | 10 | 11 | 12 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |

因此,除了第一個元素外,它都在工作。

隨你怎么想

 ELEMENT H [];

在做,可能不是。 C ++不支持動態數組-您需要使用std :: vector類。

順便說一句,按照慣例,C ++使用UPPERCASE命名預處理器宏和常量。 您應該使用大小寫混合來命名您的班級。

除了對數組的錯誤使用之外:制作heap的initialize(),buildHeap()和printHeap()成員函數也不錯。

可能是因為當您說

cout << h.H[i].key << 

H []是ELEMENTs的數組,鍵是int。 如果key是char或在cout語句中強制轉換為char,則將看到int的char表示形式。

尼爾說了什么 同樣,C ++中的數組是從零開始的。 因此,例如您在main()循環:

for (int i = 1; i <= arrayLength; i++)

應該可能是:

for (int i = 0; i < arrayLength; i++)

如果使用基於一個的數組,則可能是二進制堆構造算法的實現更簡單-在這種情況下,您需要分配足夠的空間:

ELEMENT* a = new ELEMENT[arrayLength + 1];    // Note the "+ 1"

當前,最后一次循環迭代是在數組末尾寫的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM