Мой случай 2, похоже, не читает мои файлы .txt в программировании на C

#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.

Редактировать

Похоже, вы не поняли мой первоначальный комментарий, поэтому я взял на себя смелость изменить некоторые части вашего кода.

Внесены изменения:

  1. Main () — Для программирования на C у него должен быть тип для точки входа в программу. Либо void, либо int. Если вы это сделаете, int main() убедитесь, что поставили return 0; перед последними фигурными скобками. Посмотрите на измененный код ниже для наглядности.
  2. Позиция кода, в которой должен выполняться ввод для menu. Я поместил его внутри цикла, чтобы пользователь получал запрос при каждом перезапуске цикла.

В моем первоначальном ответе или комментарии я сказал, что в вашем исходном коде точка, в которой вы изменяете свою переменную, требуемую для переключения, должна работать только один раз, и это происходит перед циклом.

Вы должны думать от 1 строки к другой. Что происходит в строке 1. Как строка 1 влияет на строку 2. В этом вашем примере, в строке 26/27, вы установили значение menu, которое когда-либо вводил пользователь (проверка ввода — это другая тема). На этом этапе он по-прежнему линейный, ничего не зацикливается, поэтому это означает, что от точки, в которой вы устанавливаете меню (строка 26/27), до точки, в которой программа завершается (или завершается), значение menu остается статичным, неизменным.

  1. Removed exit(1); Я предположил, что вы хотите, чтобы программа завершилась, если fp возвращает null и / или пользователь выбрал другой ввод для ans . Проблема с наличием точки выхода решается с помощью следующего изменения, которое я внес (см. пункт 4).
  2. Изменил код таким образом, 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, как загрузить код в комментарии, все еще очень новый для этого сайта