En huomaa millään koodin alussa olevaa virhettä tiedostoon lukemisen suhteen =( Osaako kukaan neuvoa mikä saattaa olla vialla?
#include
#include
/*Maaritetaan levytietokanta-taulukko*/
#define KOKO 21 /*KOKO:n suuruus 20 1 merkkia*/
#define PITUUS 20 /*PITUUS:n suuruus 19 1 merkkia*/
#define MAKSIMI 11 /*Maaritetaan tietueiden maksimimaara*/
/* tehdaan rakenteesta globaali */
struct levytietokanta
{
char artisti[KOKO];
char levy[PITUUS];
int vuosi;
int arvosana;
};
/****************************************************************************************************/
/*PAAOHJELMA*/
int main(int argc, char *argv[]) {
char levytietokantaNimi[100];
struct levytietokanta arkisto[MAKSIMI];
int apuri=0;
int tietoja;
int i;
char arkisto1[KOKO];
char arkisto2[PITUUS];
int vuosi2;
int arvosana2;
strcpy (levytietokantaNimi, argv[1]);
FILE *tiedosto;
/* Avataan tiedosto ja testataan onnistuiko se*/
if ((tiedosto=fopen(levytietokantaNimi,"r")) == NULL){
printf("Virhe tiedoston avaamisessa.\n");
return 0;
}
fscanf(tiedosto,"%d", &tietoja);
for(i=0;i 0)
return 1;
/*POISTETUT TIEDOT OVAT SUUREMMAT*/
if (strcmp(arkistolevytietokanta1.levy, arkistolevytietokanta2.levy) < 0)
return -1;
if (strcmp(arkistolevytietokanta1.levy, arkistolevytietokanta2.levy) > 0)
return 1;
return 0;
}
/****************************************************************************************************/
/* Näytetään paavalikko*/
int paavalikko(struct levytietokanta arkisto[]) {
int valinta;
valinta = 0;
do {
printf("\n");
printf("============\nAlkuvalikko\n============\n\n");
printf("1 = Tulosta tiedot\n");
printf("2 = Etsi tiedot\n");
printf("3 = Lisaa tietoja\n");
printf("4 = Muokkaa annetun levyn arvosanaa\n");
printf("5 = Poista tietoja\n");
printf("6 = Lajittele tiedot aakkosjarjestykseen\n");
printf("7 = Poistutaan ohjelmasta\n");
printf("\n------------\nValintasi: ");
scanf("%d", &valinta);
switch (valinta) {
case 1: {
tulosta(arkisto);
break;
}
case 2: {
etsi(arkisto);
break;
}
case 3: {
tietojenlisays(arkisto);
break;
}
case 4: {
arvosanamuutos(arkisto);
break;
}
case 5: {
tietopoistaminen(arkisto);
break;
}
case 6: {
tietojarjestely(arkisto);
break;
}
case 7: {
break;
}
default:
printf("\nVirheellinen valinta, valitse vaihtoehto valilta 1-7.");
}
}
while (valinta!=7);
printf("\nPoistutaan ohjelmasta, paina viela enteria.");
getchar(); getchar();
return 0;
}
/****************************************************************************************************/
/* TIETOJEN TALLENTAMINEN */
int tietotallennus(char *levytietokanta_nimi, struct levytietokanta levy[]){
int apuri;
FILE *tiedosto;
if ((tiedosto=fopen(levytietokanta_nimi, "w")) == NULL){
printf("Virhe tiedoston avaamisessa.\n");
return 0;
}
else {
for (apuri = 0;apuri< MAKSIMI;apuri ){
if (levy[apuri].arvosana != 0)
fprintf(tiedosto, "%s %s %d %d\n", levy[apuri].artisti, levy[apuri].levy, levy[apuri].vuosi, levy[apuri].arvosana);
}
}
fclose(tiedosto);
return 0;
}
/****************************************************************************************************/
/*TIETOJEN TULOSTAMINEN*/
int tulosta(struct levytietokanta levy[]) {
int apuri;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
printf("%s %s %d %d\n", levy[apuri].artisti, levy[apuri].levy, levy[apuri].vuosi, levy[apuri].arvosana);
}
return 0;
}
/****************************************************************************************************/
/*ETSI-TOIMINTO*/
int etsi(struct levytietokanta levy[]) {
char ehto3[PITUUS];
printf("Anna artistin nimi: ");
scanf("%s", ehto3);
int apuri;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
if (strcmp(ehto3, levy[apuri].artisti) == 0 || strcmp(ehto3, levy[apuri].levy) == 0)
printf("%s %s %d %d\n", levy[apuri].artisti, levy[apuri].levy, levy[apuri].vuosi, levy[apuri].arvosana);
}
return 0;
}
/****************************************************************************************************/
/*TIETOJEN LISAYS-TOIMINTO*/
int tietojenlisays(struct levytietokanta levy[]) {
char arkisto1[KOKO];
char arkisto2[PITUUS];
int vuosi2;
int arvosana2;
int apuri;
int lisaysindeksi;
printf("Anna levyn nimi:\n");
scanf("%s", &arkisto2);
printf("Anna artistin nimi:\n");
scanf("%s", &arkisto1);
printf("Anna levyn ilmestymisvuosi:\n");
scanf("%d", &vuosi2);
arvosana2 = 0;
do {
printf("Anna arkiston arvosana (1-10): \n");
scanf("%d", &arvosana2);
}
while (arvosana2 10);
apuri = 0;
lisaysindeksi = MAKSIMI;
while (apuri < MAKSIMI && lisaysindeksi == MAKSIMI) {
if (levy[apuri].arvosana == 0)
lisaysindeksi = apuri;
else
apuri = apuri 1;
}
if (lisaysindeksi == MAKSIMI) {
printf("Tietokanta on taynna\n");
return 1;
}
else {
strcpy(levy[lisaysindeksi].artisti, arkisto1);
strcpy(levy[lisaysindeksi].levy, arkisto2);
levy[lisaysindeksi].vuosi = vuosi2;
levy[lisaysindeksi].arvosana = arvosana2;
}
return 0;
}
/****************************************************************************************************/
/*ARVOSANAN MUUTTAMINEN*/
int arvosanamuutos(struct levytietokanta levy[]) {
char ehto1[KOKO];
char ehto2[PITUUS];
printf("Anna muutettavan artisin nimi: ");
scanf("%s", ehto1);
printf("Anna muutettavan levyn nimi: ", ehto1);
scanf("%s", ehto2);
int apuri;
int muutettu;
muutettu = 0;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
if (strcmp(ehto1, levy[apuri].artisti) == 0 && strcmp(ehto2, levy[apuri].levy) == 0) {
int arvosana2;
arvosana2 = 0;
do {
printf("Anna uusi arvosana(1-10): \n");
scanf("%d", &arvosana2);
}
while (arvosana2 10);
levy[apuri].arvosana = arvosana2;
muutettu = 1;
}
}
if (muutettu != 1)
printf("Tietoja ei loytynyt, palataan automaattisesti takaisin paavalikkoon.\n");
else
printf("Artistin %s levyn %s arvosana muutettu.\n", ehto1, ehto2 );
return 0;
}
/****************************************************************************************************/
/*TIETOJEN POISTAMINEN*/
int tietopoistaminen(struct levytietokanta levy[])
{
char ehto1[KOKO];
char ehto2[PITUUS];
printf("Anna artisti jonka levyn haluat poistaa: ");
scanf("%s", ehto1);
printf("Anna artistin %s levy jonka haluat poistaa : ", ehto1);
scanf("%s", ehto2);
int apuri;
int poistettu;
poistettu = 0;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
if (strcmp(ehto1, levy[apuri].artisti) == 0 && strcmp(ehto2, levy[apuri].levy) == 0) {
levy[apuri].arvosana = 0;
poistettu = 1;
}
}
if (poistettu != 1)
printf("arkistoa ei loydy tietokannasta\n");
else
printf("arkisto poistettu\n");
return 0;
}
/****************************************************************************************************/
/*TIETOJEN JARJESTAMINEN AAKKOSJARJESTYKSEEN*/
int tietojarjestely(struct levytietokanta levy[]) {
int apuri1;
int apuri2;
for (apuri1 = 0;apuri1
#include
#include
/*Maaritetaan levytietokanta-taulukko*/
#define KOKO 21 /*KOKO:n suuruus 20 1 merkkia*/
#define PITUUS 20 /*PITUUS:n suuruus 19 1 merkkia*/
#define MAKSIMI 11 /*Maaritetaan tietueiden maksimimaara*/
/* tehdaan rakenteesta globaali */
struct levytietokanta
{
char artisti[KOKO];
char levy[PITUUS];
int vuosi;
int arvosana;
};
/****************************************************************************************************/
/*PAAOHJELMA*/
int main(int argc, char *argv[]) {
char levytietokantaNimi[100];
struct levytietokanta arkisto[MAKSIMI];
int apuri=0;
int tietoja;
int i;
char arkisto1[KOKO];
char arkisto2[PITUUS];
int vuosi2;
int arvosana2;
strcpy (levytietokantaNimi, argv[1]);
FILE *tiedosto;
/* Avataan tiedosto ja testataan onnistuiko se*/
if ((tiedosto=fopen(levytietokantaNimi,"r")) == NULL){
printf("Virhe tiedoston avaamisessa.\n");
return 0;
}
fscanf(tiedosto,"%d", &tietoja);
for(i=0;i 0)
return 1;
/*POISTETUT TIEDOT OVAT SUUREMMAT*/
if (strcmp(arkistolevytietokanta1.levy, arkistolevytietokanta2.levy) < 0)
return -1;
if (strcmp(arkistolevytietokanta1.levy, arkistolevytietokanta2.levy) > 0)
return 1;
return 0;
}
/****************************************************************************************************/
/* Näytetään paavalikko*/
int paavalikko(struct levytietokanta arkisto[]) {
int valinta;
valinta = 0;
do {
printf("\n");
printf("============\nAlkuvalikko\n============\n\n");
printf("1 = Tulosta tiedot\n");
printf("2 = Etsi tiedot\n");
printf("3 = Lisaa tietoja\n");
printf("4 = Muokkaa annetun levyn arvosanaa\n");
printf("5 = Poista tietoja\n");
printf("6 = Lajittele tiedot aakkosjarjestykseen\n");
printf("7 = Poistutaan ohjelmasta\n");
printf("\n------------\nValintasi: ");
scanf("%d", &valinta);
switch (valinta) {
case 1: {
tulosta(arkisto);
break;
}
case 2: {
etsi(arkisto);
break;
}
case 3: {
tietojenlisays(arkisto);
break;
}
case 4: {
arvosanamuutos(arkisto);
break;
}
case 5: {
tietopoistaminen(arkisto);
break;
}
case 6: {
tietojarjestely(arkisto);
break;
}
case 7: {
break;
}
default:
printf("\nVirheellinen valinta, valitse vaihtoehto valilta 1-7.");
}
}
while (valinta!=7);
printf("\nPoistutaan ohjelmasta, paina viela enteria.");
getchar(); getchar();
return 0;
}
/****************************************************************************************************/
/* TIETOJEN TALLENTAMINEN */
int tietotallennus(char *levytietokanta_nimi, struct levytietokanta levy[]){
int apuri;
FILE *tiedosto;
if ((tiedosto=fopen(levytietokanta_nimi, "w")) == NULL){
printf("Virhe tiedoston avaamisessa.\n");
return 0;
}
else {
for (apuri = 0;apuri< MAKSIMI;apuri ){
if (levy[apuri].arvosana != 0)
fprintf(tiedosto, "%s %s %d %d\n", levy[apuri].artisti, levy[apuri].levy, levy[apuri].vuosi, levy[apuri].arvosana);
}
}
fclose(tiedosto);
return 0;
}
/****************************************************************************************************/
/*TIETOJEN TULOSTAMINEN*/
int tulosta(struct levytietokanta levy[]) {
int apuri;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
printf("%s %s %d %d\n", levy[apuri].artisti, levy[apuri].levy, levy[apuri].vuosi, levy[apuri].arvosana);
}
return 0;
}
/****************************************************************************************************/
/*ETSI-TOIMINTO*/
int etsi(struct levytietokanta levy[]) {
char ehto3[PITUUS];
printf("Anna artistin nimi: ");
scanf("%s", ehto3);
int apuri;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
if (strcmp(ehto3, levy[apuri].artisti) == 0 || strcmp(ehto3, levy[apuri].levy) == 0)
printf("%s %s %d %d\n", levy[apuri].artisti, levy[apuri].levy, levy[apuri].vuosi, levy[apuri].arvosana);
}
return 0;
}
/****************************************************************************************************/
/*TIETOJEN LISAYS-TOIMINTO*/
int tietojenlisays(struct levytietokanta levy[]) {
char arkisto1[KOKO];
char arkisto2[PITUUS];
int vuosi2;
int arvosana2;
int apuri;
int lisaysindeksi;
printf("Anna levyn nimi:\n");
scanf("%s", &arkisto2);
printf("Anna artistin nimi:\n");
scanf("%s", &arkisto1);
printf("Anna levyn ilmestymisvuosi:\n");
scanf("%d", &vuosi2);
arvosana2 = 0;
do {
printf("Anna arkiston arvosana (1-10): \n");
scanf("%d", &arvosana2);
}
while (arvosana2 10);
apuri = 0;
lisaysindeksi = MAKSIMI;
while (apuri < MAKSIMI && lisaysindeksi == MAKSIMI) {
if (levy[apuri].arvosana == 0)
lisaysindeksi = apuri;
else
apuri = apuri 1;
}
if (lisaysindeksi == MAKSIMI) {
printf("Tietokanta on taynna\n");
return 1;
}
else {
strcpy(levy[lisaysindeksi].artisti, arkisto1);
strcpy(levy[lisaysindeksi].levy, arkisto2);
levy[lisaysindeksi].vuosi = vuosi2;
levy[lisaysindeksi].arvosana = arvosana2;
}
return 0;
}
/****************************************************************************************************/
/*ARVOSANAN MUUTTAMINEN*/
int arvosanamuutos(struct levytietokanta levy[]) {
char ehto1[KOKO];
char ehto2[PITUUS];
printf("Anna muutettavan artisin nimi: ");
scanf("%s", ehto1);
printf("Anna muutettavan levyn nimi: ", ehto1);
scanf("%s", ehto2);
int apuri;
int muutettu;
muutettu = 0;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
if (strcmp(ehto1, levy[apuri].artisti) == 0 && strcmp(ehto2, levy[apuri].levy) == 0) {
int arvosana2;
arvosana2 = 0;
do {
printf("Anna uusi arvosana(1-10): \n");
scanf("%d", &arvosana2);
}
while (arvosana2 10);
levy[apuri].arvosana = arvosana2;
muutettu = 1;
}
}
if (muutettu != 1)
printf("Tietoja ei loytynyt, palataan automaattisesti takaisin paavalikkoon.\n");
else
printf("Artistin %s levyn %s arvosana muutettu.\n", ehto1, ehto2 );
return 0;
}
/****************************************************************************************************/
/*TIETOJEN POISTAMINEN*/
int tietopoistaminen(struct levytietokanta levy[])
{
char ehto1[KOKO];
char ehto2[PITUUS];
printf("Anna artisti jonka levyn haluat poistaa: ");
scanf("%s", ehto1);
printf("Anna artistin %s levy jonka haluat poistaa : ", ehto1);
scanf("%s", ehto2);
int apuri;
int poistettu;
poistettu = 0;
for (apuri = 0;apuri < MAKSIMI;apuri ) {
if (levy[apuri].arvosana != 0)
if (strcmp(ehto1, levy[apuri].artisti) == 0 && strcmp(ehto2, levy[apuri].levy) == 0) {
levy[apuri].arvosana = 0;
poistettu = 1;
}
}
if (poistettu != 1)
printf("arkistoa ei loydy tietokannasta\n");
else
printf("arkisto poistettu\n");
return 0;
}
/****************************************************************************************************/
/*TIETOJEN JARJESTAMINEN AAKKOSJARJESTYKSEEN*/
int tietojarjestely(struct levytietokanta levy[]) {
int apuri1;
int apuri2;
for (apuri1 = 0;apuri1
Vastaukset 1
Vanhimmat
Error tulee, jos fopen yrittää avata tiedostoa optiolla "r" kun tiedostoa ei ole olemassa. Siis "w" tai "a". Lue esim. http://cs.stadia.fi/~lehtk/C/c-opas30.htm