2010-07-06 104 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