2010-07-06 93 views
2

我是C++的新手,正在爲一個類進行任務。我們獲得了一個.txt文件,必須從中讀取信息,並將其存儲在鏈接列表中,然後將其打印出來給用戶。經過幾個小時的試圖操縱我們得到的例子,還有幾個小時試圖從頭開始編寫代碼,我接近兩個小時。C++鏈接器錯誤

該文件稱爲payroll.txt並且在這種類型的格式的大約30行左右:
克拉克肯特55000 2500 0.07
路易絲萊恩65000 1000 0.06
託尼斯塔克70000 1500 0.05

我們教授在評論我們的代碼時真的很重要,所以我希望它有幫助。這是我的代碼:

#include <cstdlib> 
#include <stdio.h> 
#include <cstdio> 
#include <cstdlib> 
#include <iostream> 
using namespace std; 

#define MAX_STR   100 

/* Structure Definition */ 
typedef struct employeeType Employ; 
struct employeeType { 
    char first[MAX_STR]; /* first name */ 
    char last[MAX_STR]; /* last name */ 
    int salary;   /* salary */ 
    int bonus;    /* bonus */ 
    double deduc;   /* percent deduction */ 
    Employ *next; 
}; 

/* operations on the data */ 
Employ *ReadRecord(); 
void PrintRecord(Employ *); 

main() 
{{ 
Employ *head, *tail, *newp, *tmp; 
head = tail = newp = tmp = NULL; 
FILE *in;      /* file description */ 

/* open a file, check if it's there */ 
if((in = fopen("payroll.txt", "r")) == NULL) 
{ 
    printf("Error opening file\n"); 
    exit(1); 
} 
while(newp = ReadRecord()) 
{ 
    /* Add object to the list */ 
    if(head == NULL) 
    { 
     /* Beginning of the list */ 
     head = newp; 

     /* Current record */ 
     tail = newp; 
    } 
    else 
    { 
     /* Previous record reference to new record */ 
     tail->next = newp; 

     /* Current record */ 
     tail = newp; 
    } 
} 

/* End of the list */ 
tail->next = NULL; 

/* Loop through the list */ 
for(tmp=head; tmp!=NULL; tmp=tmp->next) 
{ 
    PrintRecord(tmp); 
} 

現在,當我編譯,我得到的錯誤:
[鏈接錯誤]未定義參考ReadRecord()
[鏈接錯誤]未定義參考PrintRecord(employeeType *)

我幾乎可以肯定他在這個例子中給我們的ReadRecord和PrintRecord命令是僞代碼,這意味着我們搞砸了,但是我不知道該怎麼去那裏。我一直在翻閱多本教科書,並尋找一種簡單的方法來修復在線鏈接錯誤,並且已經用完了想法。

如果有人能幫助我/指出我在正確的方向,將不勝感激。鏈接到鏈接列表和鏈接器錯誤更多信息的網頁鏈接將更加棒。

謝謝
亞當

+0

是否使用的是C++編譯器? – 2010-07-06 14:59:37

+0

我正在使用Dev-C++。 – AdamY 2010-07-06 15:03:00

+3

您應該添加C標籤。除了包含的頭文件和'using'子句,這幾乎不是C++。 – pmr 2010-07-06 15:10:31

回答

5

鏈接器抱怨說您已經引用了函數ReadRecordPrintRecord,但是您還沒有寫入它們。您可以在當前文件的末尾編寫這些函數。你可以用這個模板開始:

// Read a record from the file and parse the data into a structure 
Employ *ReadRecord (void) { 

    // Use fgets() to read a line from the file 

    // Create a new Employ object to hold the data 

    // Use sscanf() to parse individual fields out of the string 
    // and store them in the new Employ object 

    // Return a pointer to the new Employ object 

    return (Employ*)NULL; 
} 

// Print the information from the structure to the screen 
void PrintRecord (Employ *ptr) { 

    // Use printf() to display the content of each field 

    return; 
} 

與添加到文件中的這些功能模板,鏈接器不再抱怨未定義的引用(因爲現在已經創建了功能)。但是,代碼將無法正常工作,因爲這些功能實際上並不是什麼。你將需要填寫功能的主體(根據你的任務的細節)。

編輯:我已經包括了一些提示(作爲代碼註釋),以防萬一你不知道從哪裏開始。有關從文本文件中解析數據或在屏幕上顯示信息的詳細幫助,請參閱您的教科書(它應該有許多示例在這種情況下對您有所幫助)。

更新:幾個環節:

+0

噢...好的。 所以我得到鏈接器錯誤的原因是因爲我需要正確定義函數?這就說得通了。感謝您清除鏈接器錯誤問題。 我一直在閱讀一些關於如何操作代碼的教科書,但是仍然不太瞭解數據存儲在這個程序中的方式。你知道任何在線信息來源,我可以更多地閱讀這些信息嗎? – AdamY 2010-07-06 15:29:42

+0

當你說你「不理解數據存儲在這個程序中的方式」時,你是什麼意思?你的意思是說你不明白數據寫入文本文件的方式嗎?或者你不明白你的程序在從文件中讀取數據時應該如何存儲數據? – bta 2010-07-06 15:35:23

+0

我的意思是我不明白程序應該如何存儲數據,我不明白我應該如何引用它。每次我讀到指針,數組和結構時,它都會變得更清晰,但我仍然有點困惑。 有沒有可以推薦的書? – AdamY 2010-07-06 15:41:39

2

爲這些功能你只有原型:

Employ *ReadRecord(); 
void PrintRecord(Employ *); 

但沒有屍體。所以鏈接器找不到它們。你忘了添加這些功能的主體另一個文件?

+0

我沒有收到其他文件。教授還沒有在頭文件中分類。我想這意味着我需要建立屍體。 你知道一個網站可能有關於我需要構建的更多信息嗎?可能是 – AdamY 2010-07-06 15:09:06

+0

。 'ReadRecord'將從文件讀取記錄並創建新的'Employ'實例並返回指向它的指針。 'PrintRecord'將打印給定的記錄。我不知道你想要實際學到什麼。 – Andrey 2010-07-06 15:16:12

+0

如果您知道任何可以幫助我構建ReadRecord和PrintRecord的站點,它將會很有用。我發現自己一直在理解信息的存儲方式,所以我無法編寫正確的代碼來讀取和操作它。 – AdamY 2010-07-06 15:21:02

0

您可能已經獲得了一個頭文件(.h)文件,但是在其相應的源代碼(.cpp,.cc,.cxx)中沒有定義ReadRecord(...)或PrintRecord(...)文件。要麼是這樣,要麼你沒有編譯.c文件,所以你的鏈接器沒有包含.o文件。

+0

我沒有給出任何其他文件的示例代碼。 你是什麼意思我可能無法編譯.c文件? (對不起,我還是C/C++的新手,我使用Dev-C++編輯工具,當我想我的代碼準備好並等待錯誤時,點擊編譯按鈕。) – AdamY 2010-07-06 15:10:51

+0

AdamY,如果你不是如果.c文件中包含ReadRecord(...)和PrintRecord(...)的內容,那麼你的教授可能就是爲你寫這些方法的。考慮到你可能寫了「struct employeeType」,你的教授就不可能猜出正確的結構域來使這兩個需要的函數有效。 – 2010-07-06 15:14:44

+0

這是正確的。我寫了「struct employeeType」,所以他無法預測正確的字段。如果我堅持瞭解程序如何存儲信息,那麼我不知道如何去編寫ReadRecord和PrintRecord的方法。 有沒有像cplusplus.com這樣的在線資源,可能有關於這個問題的更多信息? – AdamY 2010-07-06 15:25:29

0

您嘗試使用的兩個功能ReadRecord()PrintRecord(Employ *)尚未定義。一旦你定義了這些函數,你將不會再得到這些鏈接錯誤。

從您使用函數的方式來判斷,ReadRecord是爲了讀取文件,從讀取的信息中創建一個Employ並返回它。 PrintRecord旨在打印出Employ(可能以教授向您提供的格式打印)中包含的信息。

我希望有幫助。

0

您所需要的只是實現ReadRecord()PrintRecord()函數。顯然, ReadRecord()應該從文件讀取記錄,使用文件描述符或文件名作爲輸入參數,並且PrintRecord()應打印到標準輸出或作爲輸入參數給定的文件名。無論如何,細節是你的設計特定的。

+0

實現這些功能究竟意味着什麼? (對不起,我對C仍然很陌生,並且只在線上課了兩週。) – AdamY 2010-07-06 15:22:28