2010-07-06 3 views
2

Я новичок в C++ и работал над назначением для класса. Нам был предоставлен файл .txt, он должен прочитать информацию из него и сохранить его в связанном списке, а затем распечатать его пользователю. После нескольких часов попыток манипулировать приведенными нами примерами, а еще пару часов, когда мы пытались написать код с нуля, я становлюсь ближе к нему.Ошибка C++ Linker

Файл называется payroll.txt и имеет около 30 или около линий в этом типе формата:
Clark Kent 55000 2500 0,07
Lois Lane 65000 1000 0,06
Tony Stark 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); 
} 

Теперь, когда я компилирую, я получаю ошибки:
[Linker Error] неопределенную ссылку на ReadRecord()
[Linker Error] неопределенному ссылку на PrintRecord (employeeType *)

Я почти уверен, что команды ReadRecord и PrintRecord, которые он нам дал в этом примере, это Pseudo Code, предназначенный для нас, но я понятия не имею, что там можно сделать. Я проливал много учебников и искал простой способ исправить ошибки компоновщика в Интернете, и у меня закончились идеи.

Если кто-нибудь может мне помочь или указать мне в правильном направлении, было бы весьма полезно. Ссылка на веб-страницу с дополнительной информацией о связанных списках и ошибках компоновщика будет еще более удивительной.

Спасибо,
Адам

+0

Какой C++ компилятор вы используете? – 2010-07-06 14:59:37

+0

Я использую Dev-C++. – AdamY

+3

Вы должны добавить тег C. Это вряд ли C++, кроме включенных заголовков и 'use' clause. – pmr

ответ

5

Линкера жалуется, что вы ссылались на функции ReadRecord и PrintRecord, но вы еще не написали их. Вы можете записать эти функции в конец текущего файла. Вы можете начать с этим шаблоном:

// 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; 
} 

С помощью этих функций шаблонов, добавленных в файл, линкер больше не жалуется на неопределенных ссылках (поскольку функции уже были созданы). Однако код будет работать некорректно, так как эти функции фактически не do ничего. Вам нужно будет заполнить тело функций (на основе деталей вашего задания).

Редактировать: Я включил несколько советов (в виде комментариев кода) на случай, если вы не знаете с чего начать. Для получения подробной справки по анализу данных из текстового файла или отображению информации на экране обратитесь к своему учебнику (у него должно быть много примеров, которые помогут вам в этом случае).

Обновление: Несколько ссылок:

+0

Ох ... Хорошо. Так почему я получил ошибки компоновщика, потому что мне нужно было правильно определить функции? В этом есть смысл. Благодарим вас за устранение проблемы с ошибкой компоновщика. Я читал некоторые учебники о том, как манипулировать кодом, когда он хранится, но все еще недостаточно понимает, как данные хранятся в этой программе. Знаете ли вы о каких-либо онлайн-источниках информации, где я могу это узнать больше? – AdamY

+0

Что вы имеете в виду, когда говорите, что «не понимаете, как хранятся данные в этой программе»? Вы имеете в виду, что вы не понимаете, как данные записываются в текстовый файл? Или вы не понимаете, как ваша программа должна хранить данные после их чтения из файла? – bta

+0

Я имею в виду, что я не понимаю, как программа должна хранить данные, и я не понимаю, как я должен ссылаться на нее. Каждый раз, когда я читаю о указателях, массивах и структурах, он становится немного яснее, но я все еще несколько смущен. Есть ли книга, которую вы можете порекомендовать? – AdamY

2

для тех функций, у вас есть только прототипы:

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

, но нет тела. Поэтому линкер не может их найти. Вы забыли добавить еще один файл с телом этих функций?

+0

Не было другого файла, который я получил. Профессор еще не входил в отдельные файлы, с точки зрения заголовков, в классе. Думаю, это означает, что мне нужно построить тела. Знаете ли вы сайт, который может иметь больше информации о том, что мне нужно будет создать? – AdamY

+0

возможно. 'ReadRecord' будет читать запись из файла и создавать новый экземпляр' Employ' и возвращать указатель на него. 'PrintRecord' напечатает данную запись. я не знаю, что вы хотите узнать на самом деле. – Andrey

+0

Если вы знаете любой сайт, который мог бы помочь мне создать ReadRecord и PrintRecord, это было бы полезно. Я застрял в понимании того, как хранится информация, поэтому мне трудно написать правильный код, чтобы читать и манипулировать им. – AdamY

0

Возможно, вам был предоставлен файл файла заголовка (.h), но нет функций ReadRecord (...) или PrintRecord (...), определенных в его соответствующем исходном коде (.cpp, .cc, .cxx) файл. Либо это, либо вам не удалось скомпилировать файл .c, чтобы в ваш компоновщик не было файла .o.

+0

Мне не дали никакого другого файла с примером кода. Что значит, я, возможно, не смог скомпилировать файл .c? (Извините, я по-прежнему новичок в C/C++. Я использую инструмент редактирования Dev-C++ и просто нажимаю кнопку компиляции, когда думаю, что мой код готов и ждет ошибок.) – AdamY

+0

AdamY, если вы не были учитывая файл .c с содержимым ReadRecord (...) и PrintRecord (...), то вы, возможно, профессор, должны были написать эти методы. Учитывая, что вы, вероятно, написали «struct employeeType», было бы невозможно, чтобы ваш профессор угадал правильные поля структуры, чтобы эти две необходимые функции работали. –

+0

Это правильно. Я написал «struct employeeType», поэтому он не мог предсказать правильные поля. Где я застрял, понимает, как программа хранит информацию, поэтому я действительно не знаю, как писать методы для ReadRecord и PrintRecord. Есть ли в Интернете источники, такие как cplusplus.com, которые могут иметь дополнительную информацию по этому вопросу? – AdamY

0

Две функции, которые вы пытаетесь использовать, ReadRecord() и PrintRecord(Employ *), еще не определены. Вы больше не будете получать эти ошибки Linker после определения этих функций.

Судя по тому, как вы использовали функции, ReadRecord предназначен для чтения файла, создайте Employ из прочитанной информации и верните ее. PrintRecord предназначен для печати информации, содержащейся в файле Employ (возможно, напечатан в формате, предоставленном вам вашим профессором).

Я надеюсь, что это поможет.

0

Все, что вам нужно, это реализовать только функции ReadRecord() и PrintRecord(). По-видимому, ReadRecord() должен читать записи из файла, используя дескриптор файла или имя файла в качестве входного аргумента, а PrintRecord() должен печатать на stdout или файл с именем, указанным в качестве входного аргумента. В любом случае, детали вашего дизайна.

+0

Что значит точно реализовать функции? (Извините, я до сих пор очень новичок в C и только два раза занимаюсь онлайн-классом.) – AdamY

Смежные вопросы