Имам няколко проблема, докато се опитвам да запазя информация от моята програма в .txt файл (или във всеки друг файл). Преглеждах кода си няколко пъти и не мога да намеря проблема. Първоначално си мислех, че може да има някаква форма на изтичане на памет (въпреки че не знам последствията от изтичане на памет, така че не мога да съм сигурен).
Искам да поясня, че това е училищна задача и в крайна сметка трябва да уча, така че не ми давайте отговора твърде лесно!
Поръчката ни е последна и най-голяма. Създаваме списък с хранителни стоки със структури. Проблемът започна, когато се опитвах да използвам членовете на структурата, за да запазя информация в .txt файл (за да ги заредя в програмата по-късно, ако желаете). Знам, че кодът вероятно е ужасен и дразнещ за гледане, но моля, изтърпете ме.
Това е моята функция "запазване". Това е много елементарно и доста ужасно.
void saveList(struct GList *grocery)
{
char file[20];
FILE *fp;
printf("What do you want to save the list as? (Don't include file extension): ");
scanf("%s", file);
fp = fopen(strcat(file, ".txt"), "w");
for (int i=0; i<grocery->Items; i++)
{
printf("%s %f %s\n", grocery->list[i].name, grocery->list[i].amount, grocery->list[i].unit);
fprintf(fp, "%s %f %s\n", grocery->list[i].name, grocery->list[i].amount, grocery->list[i].unit);
}
fclose(fp);
}
Това е, което въвеждам в моята програма (когато добавям елемент):
Name of the item: Avocado
Unit: kg
Amount: 10
Това е, което се записва в моя .txt файл (не се показва, но първият ред винаги съдържа някакъв странен символ).
10.000000 kg
milk 10.000000 litres
Същият проблем възниква през цялото време; първото име на елемент (напр. авокадо) се показва като някакъв странен символ.
Това е пълният ми код, проблемът може да се крие някъде тук.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <string.h>
struct Grocery {
char name[20];
char unit[20];
float amount;
};
struct GList {
size_t Items;
struct Grocery *list;
};
int addGrocery();
void printList();
void hQuit();
void inputError();
void removeItem();
void changeItem();
void saveList();
int main()
{
struct GList glist;
glist.Items = 1;
size_t menuChoice = 0;
char cont = 'y';
if((glist.list = malloc(sizeof(glist.list))) == NULL)
return ENOMEM;
puts("Welcome to your Grocery List Manager");
do
{
printf("\n- - - - - - - - - - -\n[1] Add an item\n[2] Print grocery list\n[3] Remove a grocery\n[4] Edit a grocery\n[5] Save your list\n[6] Load a list\n[7] Quit\n\nPlease choose action: ");
if(!scanf("%u", &menuChoice))
return EIO;
putchar('\n');
switch(menuChoice)
{
case 1:
addGrocery(&glist);
break;
case 2:
printList(&glist);
break;
case 3:
removeItem(&glist);
break;
case 4:
changeItem(&glist);
break;
case 5:
saveList(&glist);
break;
case 6:
//Load shopping list
break;
case 7:
hQuit(&glist);
break;
default:
inputError();
break;
}
} while (cont == 'y');
//free(grocery);
return 0;
}
int addGrocery(struct GList *grocery)
{
printf("Name of the grocery: ");
if(!scanf("%s", grocery->list[grocery->Items].name))
return EIO;
printf("Unit: ");
if(!scanf("%s", grocery->list[grocery->Items].unit))
return EIO;
printf("Amount: ");
if(!scanf("%f", &grocery->list[grocery->Items].amount))
return EIO;
printf("You have added %f %s of %s into your list!\n\n", grocery->list[grocery->Items].amount, grocery->list[grocery->Items].unit, grocery->list[grocery->Items].name);
(grocery->Items)++;
grocery->list = realloc(grocery->list, grocery->Items * sizeof(grocery->list));
if(grocery->list == NULL)
return ENOMEM;
return 1;
}
void printList(struct GList *grocery)
{
if ((grocery->Items - 1) > 0)
printf("You have added %d item(s) into your list!\n", grocery->Items - 1);
else
printf("You have no items in your list!\n");
for (int i=1; i<grocery->Items; i++)
{
printf("[%d] %-10s %.1f %s\n", i, grocery->list[i].name, grocery->list[i].amount, grocery->list[i].unit);
}
putchar('\n');
}
void removeItem(struct GList *grocery)
{
size_t index = 0;
printf("Which item would you wish to remove from the list? ");
scanf("%u", &index);
printf("\nYou have removed %s from your grocery list!", grocery->list[index].name);
for (int i=(int)index; i < grocery->Items; i++)
grocery->list[i] = grocery->list[i+1];
(grocery->Items)--;
}
void changeItem(struct GList *grocery)
{
size_t index = 0;
printf("Which item would you like to edit the amount of? ");
scanf("%d", &index);
printf("\nCurrent amount: %.1f %s\nEnter new amount: ", grocery->list[index].amount, grocery->list[index].unit);
scanf("%f", &grocery->list[index].amount);
printf("\nYou changed the amount to %.1f!\n", grocery->list[index].amount);
}
void hQuit(struct GList *grocery)
{
puts("*-*-* Thank you for using the Grocery List! *-*-*");
free(grocery->list);
exit(0);
}
void inputError(struct GList *grocery)
{
puts("No such option. Please try again!\n");
}
void saveList(struct GList *grocery)
{
char file[20];
FILE *fp;
printf("What do you want to save the list as? (Don't include file extension): ");
scanf("%s", file);
fp = fopen(strcat(file, ".txt"), "w");
for (int i=0; i<grocery->Items; i++)
{
printf("%s %f %s\n", grocery->list[i].name, grocery->list[i].amount, grocery->list[i].unit);
fprintf(fp, "%s %f %s\n", grocery->list[i].name, grocery->list[i].amount, grocery->list[i].unit);
}
fclose(fp);
}
Ако кодът ми изглежда много странно на някои места (защо имате void inputError()?), това е защото нашият учител задава някои много странни правила за нашите задачи.
Моля, не се колебайте да разбиете моя код.
T*p=[m/c/re]alloc(sizeof T*)
греши. - person EOF   schedule 11.01.2018n
указатели съвсем добре. Сега какво сочат? - person Lee Daniel Crocker   schedule 11.01.2018scanf("%s", file);
се изпълни? - person chux - Reinstate Monica   schedule 11.01.2018