Ошибка "Неразрешенный внешний элемент" - C (СИ)
Формулировка задачи:
#include "StdAfx.h"
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <locale.h>
#include <io.h>
void add_tex(void), lookup(void), del_tex(void), cop_tex(void), red_tex(void), poisk_tex(void), count(void);
char menu(void);
long int password;
long int pasw;
long int pasw2;
int str;
int i=0;
int nomer=0;
struct texnika{
char naz[30];
char tip[20];
int kol_vo;
int god;
int cena;
};
struct texnika tender[50];
int main(void)
{
char choice;
do {
choice = menu();
switch(choice) {
case '2': add_tex();
break;
case '1': lookup();
break;
case '3': del_tex();
break;
case '4': cop_tex();
break;
case '5': red_tex();
break;
case '7': poisk_tex();
break;
}
} while (choice!='6');
return 0;
}
/* вывод меню и получение запроса */
char menu(void)
{
char ch;
setlocale(LC_ALL,"Russian");
printf("Введите пароль: ");
scanf("%ld",&password);
pasw = 123456;
pasw2 = 456789;
if(password!=pasw){
printf("Неверный пароль\n");
getch();
return 1;}
do {
printf("(1) Просмотр\n");
printf("(2) Добавить\n");
printf("(3) Удалить\n");
printf("(4) Копировать\n");
printf("(5) Редактировать\n");
printf("(6) Выход\n");
printf("(7) Поиск\n");
ch = tolower(getche());
printf("\n");
} while(ch != '3' && ch != '2' && ch != '1' && ch != '4' && ch !='5' && ch !='6' && ch !='7');
return ch;
}
/* добавление техники */
void add_tex(void)
{
FILE *fp;
char naz[80], tip[30];
int kol_vo, god, cena;
if((fp=fopen("input.txt", "a")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
printf("Введите название, тип, кол-во, год и цену: ");
fscanf(stdin, "%s%s%5d%d%d", &tender[i].naz, &tender[i].tip, &tender[i].kol_vo, &tender[i].god, &tender[i].cena);
fscanf(stdin, "%*c"); /* удаление возврата каретки из потока ввода */
fprintf(fp,"%s %s %d %d %d\n", &tender[i].naz, &tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
fclose(fp);
}
/* просмотр */
void lookup(void)
{
FILE *fp;
char naz[80], tip[80];
int kol_vo, god, cena;
if((fp=fopen("input.txt", "r")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
printf("\n|Название| Тип |Кол-во| Год | Цена |\n\n");
while (fscanf(fp,"%s%s%d%d%d",&tender[i].naz, &tender[i].tip, &tender[i].kol_vo, &tender[i].god, &tender[i].cena)!=EOF){
printf("%s\t%s\t%3d\t%d\t%d\n", &tender[i].naz, &tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);}
nomer++;
fclose(fp);
}
/*удаление записи*/
void del_tex(void)
{
FILE *fp;
FILE *fp2;
int nomer,i=0;
//char naz[80], tip[80],mas[100];
//int kol_vo, god, cena;
int str=0;
char ch;
if((fp=fopen("input.txt", "r")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
while (fscanf(fp,"%s%s%d%d%d",&tender[i].naz, &tender[i].tip, &tender[i].kol_vo, &tender[i].god, &tender[i].cena)!=EOF){
str++;
i++;
}
printf("Кол-во строк: %d\n",str);
printf("Введите нормер записи которую надо удалить: \n");
scanf("%d",&nomer);
if (nomer<1 || nomer>str){
printf("Неправильынй ввод!");
getch();
exit(1);
}
if((fp2=fopen("output.txt", "w")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
else
{
for (i=0;i<str;i++){
if (i!=(nomer-1)){
fprintf(fp2,"%s %s %d %d %d\n", &tender[i].naz, &tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
printf("%s\t%s\t%3d\t%d\t%d\n", tender[i].naz, tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
}
}
fclose(fp2);
fclose(fp);
remove("input.txt");
if(0==rename ("output.txt","input.txt"))
printf("Выполнено успешно\n");
}
}
/*Копирование в дополнительынй файл*/
void cop_tex(void)
{
char var;
char imya[20];
FILE *fp, *fp2;
const int size=256;
char mass[size];
/*Копирование*/
if((fp=fopen("input.txt", "rb")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
printf("Введите имя файла (с расширением): \n");
scanf("%s",imya);
if((fp2=fopen(imya, "wb")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
size_t read;
while((read = fread(mass,sizeof(char),size,fp)) != 0)
{
fwrite(mass,sizeof(char),read,fp2);
fclose(fp);
fclose(fp2);
}
}
void red_tex(void)
{
FILE *fp;
FILE *fp2;
int nomer,i=0;
int str=0;
char ch;
if((fp=fopen("input.txt", "r")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
while (fscanf(fp,"%s%s%d%d%d",&tender[i].naz, &tender[i].tip, &tender[i].kol_vo, &tender[i].god, &tender[i].cena)!=EOF){
str++;
i++;
}
printf("Кол-во строк: %d\n",str);
printf("Введите номер записи которую необходимо редактировать: \n");
scanf("%d",&nomer);
if (nomer<1 || nomer>str){
printf("Неправильынй ввод!");
getch();
exit(1);
}
if((fp2=fopen("output.txt", "w")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
else
{
for (i=0;i<str;i++){
if (i!=(nomer-1)){
fprintf(fp2,"%s %s %d %d %d\n", &tender[i].naz, &tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
//printf("%s\t%s\t%3d\t%d\t%d\n", tender[i].naz, tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
}
if (i==(nomer-1)){
printf("Введите новое название, тип, кол-во, год и цену: ");
fscanf(stdin, "%s%s%5d%d%d", &tender[i].naz, &tender[i].tip, &tender[i].kol_vo, &tender[i].god, &tender[i].cena);
fscanf(stdin, "%*c"); /* удаление возврата каретки из потока ввода */
fprintf(fp2,"%s %s %d %d %d\n", &tender[i].naz, &tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
}
}
fclose(fp2);
fclose(fp);
remove("input.txt");
if(0==rename ("output.txt","input.txt"))
printf("Выполнено успешно\n");
}
}
/*Поиск*/
void poisk_tex(void)
{
FILE *fp;
if((fp=fopen("input.txt", "r")) == NULL) {
printf("Невозможно открыть файл.");
exit(1);
}
while(!feof(fp)){
++i;
fscanf(fp, "%s", tender[i].naz);
fscanf(fp, "%s", tender[i].tip);
fscanf(fp, "%f", &tender[i].kol_vo);
fscanf(fp, "%f", &tender[i].god);
fscanf(fp, "%f", &tender[i].cena);
printf("%s%s%f%f%f",tender[i].naz, tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
}
count();
printf("Введите название техники: \n");
gets(tender[i].naz);
int result=0;
for (int i=1;i<=str;)
{
if(tender[0].naz==tender[i].naz)
{
printf("%s%s%f%f%f",tender[i].naz, tender[i].tip, tender[i].kol_vo, tender[i].god, tender[i].cena);
i++;
result++;
}
else
i++;
}
if (result==0)
{
printf("Ничего не найдено\n");
}
}
void Count(void)
{
FILE *fp;
fp=fopen("input.txt", "r");
int i=0;
int str=0;
while(!feof(fp))
{
++i;
str++;
fscanf(fp, "%s", tender[i].naz);
fscanf(fp, "%f", &tender[i].god);
}
fclose(fp);
}Решение задачи: «Ошибка "Неразрешенный внешний элемент"»
textual
Листинг программы
fp=fopen("input.txt", "r");
Объяснение кода листинга программы
- Открывается файл
input.txtдля чтения (r). - Переменная
fpиспользуется для хранения файлового указателя. - Если файл не может быть открыт, то программа выводит сообщение об ошибке и завершает свое выполнение.