#c #inventory
#c #инвентаризация
Вопрос:
Я работал над этой программой для своей работы, в которой я пытаюсь составить инвентаризацию инструментов. Я очень новичок в программировании, если есть альтернативный способ справиться с этим, я открыт для его изучения.
Мой первый случай работает. Все, что он делает, это запрашивает у пользователя номенклатуру, номер детали (P / N) и серийный номер (S / N).
Во втором случае я пытаюсь заставить его распечатать список данных.
Моя цель для этого — исправить мою проблему для моего второго случая
#include<stdio.h>
#include<stdlib.h>
main()
{
FILE * fp;
int qty;
int menu;
char nomen[26];
char pN[26];
char ans;
//Test to see if file exist
fp = fopen("Metro Inventory.txt", "w");
if (fp == NULL)
{
printf("*Error opening file*");
fprintf(fp,"*Error opening file*");
exit(1);
}
//Intro Header
fprintf(fp,"List of Special Tools:");
fprintf(fp,"tttPart Number:");
fprintf(fp,"tt Quantity:nn");
printf("Metro Aviation Tools Listnn");
printf("What would you like to do?n");
scanf("%d", amp;menu);
//loop of switch asking for nomenclature
do
{
switch (menu)
{ //Case 1 adds new content
case(1):
{
printf("Enter Nomenclature(no spaces):n");
scanf("%s", nomen);
fputs(nomen, fp);
fputs("ttt",fp);
//Part Number
printf("What is the part number?n");
scanf("%s", pN);
fputs(pN, fp);
fputs("ttt", fp);
//Quantity
printf("What is the quantity?n");
scanf("%d", amp;qty);
fprintf(fp,"%d",qty);
fputs("n", fp);
break;
fclose(fp);
}// Case 2 Edits content
case(2):
{
int c;
fp = fopen("Metro Inventory.txt", "r");
if (fp)
{
while ((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
}
fclose(fp);
break;
}
default : printf("Thank you");
break;
}//end switch
printf("To add tool type Y.n To exit type N.n");
getch();
scanf("n%c", amp;ans);
//loop
}
while ((ans == 'Y')||(ans == 'y'));
if ((ans == 'N')||(ans=='n'));
{
exit(1);
}
getch();
возвращает 0; }
Ответ №1:
Я не выполнял файловый ввод-вывод для C довольно долгое время, однако, быстрый просмотр вашей программы показывает, что время, когда вы устанавливаете / изменяете значение menu, находится в строке 26/27. Затем ваш цикл начинается со строки 29. После этого нет никаких инструкций для установки / изменения вашего значения menu.
Позже, в строках с 73 по 75, вы запрашиваете ввод до завершения области цикла. Этот ввод используется только позже в другом цикле. Что я бы посоветовал вам, так это удалить всю структуру switch case и позволить программе запускаться и продолжать делать все, что вы хотите. Поскольку также нет никаких объяснений, почему пользователь должен выбрать 1 для menu или 2.
Редактировать
Похоже, вы не поняли мой первоначальный комментарий, поэтому я взял на себя смелость изменить некоторые части вашего кода.
Внесены изменения:
- Main () — Для программирования на C у него должен быть тип для точки входа в программу. Либо void, либо int. Если вы это сделаете,
int main()
убедитесь, что поставилиreturn 0;
перед последними фигурными скобками. Посмотрите на измененный код ниже для наглядности. - Позиция кода, в которой должен выполняться ввод для menu. Я поместил его внутри цикла, чтобы пользователь получал запрос при каждом перезапуске цикла.
В моем первоначальном ответе или комментарии я сказал, что в вашем исходном коде точка, в которой вы изменяете свою переменную, требуемую для переключения, должна работать только один раз, и это происходит перед циклом.
Вы должны думать от 1 строки к другой. Что происходит в строке 1. Как строка 1 влияет на строку 2. В этом вашем примере, в строке 26/27, вы установили значение menu, которое когда-либо вводил пользователь (проверка ввода — это другая тема). На этом этапе он по-прежнему линейный, ничего не зацикливается, поэтому это означает, что от точки, в которой вы устанавливаете меню (строка 26/27), до точки, в которой программа завершается (или завершается), значение menu остается статичным, неизменным.
Removed exit(1);
Я предположил, что вы хотите, чтобы программа завершилась, еслиfp
возвращает null и / или пользователь выбрал другой ввод дляans
. Проблема с наличием точки выхода решается с помощью следующего изменения, которое я внес (см. пункт 4).- Изменил код таким образом,
if (fp != null)
что является частью else в новом коде (см. строку 20), программа разрешит запись в файл. И еслиfp
возвращает null, вся программа завершится сreturn 0;
.
Измененный код
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE * fp;
int qty;
int menu;
char nomen[26];
char pN[26];
char ans;
//Test to see if file exist
fp = fopen("Metro Inventory.txt", "w");
if (fp == NULL)
{
printf("*Error opening file*");
fprintf(fp,"*Error opening file*");
}
else
{
//Intro Header
fprintf(fp,"List of Special Tools:");
fprintf(fp,"tttPart Number:");
fprintf(fp,"tt Quantity:nn");
do
{
printf("Metro Aviation Tools Listnn");
printf("What would you like to do?n");
scanf("%d", amp;menu);
//loop of switch asking for nomenclature
switch (menu)
{ //Case 1 adds new content
case(1):
{
printf("Enter Nomenclature(no spaces):n");
scanf("%s", nomen);
fputs(nomen, fp);
fputs("ttt",fp);
//Part Number
printf("What is the part number?n");
scanf("%s", pN);
fputs(pN, fp);
fputs("ttt", fp);
//Quantity
printf("What is the quantity?n");
scanf("%d", amp;qty);
fprintf(fp,"%d",qty);
fputs("n", fp);
break;
fclose(fp);
}
// Case 2 Edits content
case(2):
{
int c;
fp = fopen("Metro Inventory.txt", "r");
if (fp)
{
while ((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
}
fclose(fp);
break;
}
default :
printf("Thank you");
break;
}//end switch
printf("To add tool type Y.n To exit type N.n");
getch();
scanf("n%c", amp;ans);
//loop
}while ((ans == 'Y')||(ans == 'y'));
}
return 0;
}
Комментарии:
1. Также переключите строку 51 на строку 52, поскольку разрыв в строке 51 не позволит вам закрыть файл, который находится в строке 52
2. Я сделал это до сих пор. Я изменил переключатель на инструкции if, в которых я могу получать информацию, но все еще не могу распечатать их на своем экране.
3. // Случай 2 Редактирует содержимое, если (menu == 2) { int c; fp = fopen («Metro Inventory2.txt «, «r»); if (fp) { while ((c = getc(fp)) != EOF) putchar(c); } }
4. ‘// Случай 2 Редактирует содержимое, если (menu == 2) { int c; fp = fopen («Metro Inventory2.txt «, «r»); if (fp) { while ((c = getc(fp)) != EOF) putchar(c); } } ‘
5. извините, idk, как загрузить код в комментарии, все еще очень новый для этого сайта