Jag sitter i ANSI C och donar med ett mycket enkelt cd-register. Registret innehåller artist och skivtitel och detta sparas ner till hårddisken till en textfil. Programmet innehåller en meny och i den kan man välja på att öppna registret, skriva poster, radera poster och sortera registret.
Jag öppnar filen i main() och skickar en filpekare till varje funktion, jag har i dagsläget skrivit funktionen för öppning och skrivning till registret. Skall börja med funktionen radera poster och det är där det börjar att strula lite, jag har i textfilen grupperat artisten och titeln med en nyrad och har sedan en tomrad emellan varje post.
Hur gör jag för att kunna söka och radera en post, jag skall använda strcat() funktionen för att kunna jämföra strängarna men jag känner inte rikrigt att jag har koll på hur jag skall behandla och i vilket faktiskt format det inlästa strängen ifrån filen blir. Jag vill ju kunna radera en post som ligger placerad som exempelvis nr 3 i den totala mängden poster...? Likadant blir det när jag skall sortera upp filen så att den listar posterna efter namnet på artisten i bokstavsordning, jag greppar inte hur jag skall behandla strängen så att det blir korrekt. Har inte riktig koll på detta så frågar er om lite hjälp.
Sedan har jag lite problem med FILE och hanteringen av detta i funktioner, Jag hade tänkt öppna filen för läsning/skrivning i varje funktion men då får jag kompileringsfel som säger att deklarationen av FILE inte stämmer. Öppnar jag dock filen i main så går det bra men jag får varningar om att inte formal och actual parameter stämmer när jag skickar med filpekaren i funktionsanropet ifrån main.
Jag har klistrat in koden för hela programmet men den är ganska lång, ni får plocka ut det som jag frågar om


Kod: Markera allt
///////////////////////////////////////////////////////////////////////
// Namn: Johnny Lindberg
// Datum: 2005-12-26
// Version: Ver. 1.0
// Beskrivning: Detta program fungerar som ett enkelt
// cd-register. Man kan skriva in och radera
// titlar och söka samt sortera dom.
//
///////////////////////////////////////////////////////////////////////
//Denna rad definierar vilket bibliotek som skall användas
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
// Makro definieringar
#define TRUE 1
// Funktionsprototyper
void skrivInformation(void);
void menyVal(void);
void oppnaRegister(fpPek);
void skrivaPost(fpPek);
void raderaPost(void);
void sorteraRegister(void);
//Detta är huvudfunktionen
int main(void)
{
//Variabel och pekardeklaration och tilldelning
FILE *fpPek;
int iMenyVal = 0;
// Nu skriver vi ut lite informationstext om programmet
skrivInformation();
// Nu startar meny-slingan
while (TRUE)
{
menyVal(); // Skriv ut menyn
printf(" Ange ett menyval (1-5), avsluta med enter: ");
scanf_s("%d", &iMenyVal, 1);
fflush(stdin);
// Nu skall vi kontrollera vad du har skrivit in
switch(iMenyVal)
{
case 1:
if ((fpPek = fopen("cd-register.txt", "r")) == NULL)
{
printf("Filen kunde inte \x94ppnas\n\n");
exit(1);
}
oppnaRegister(fpPek);
break;
case 2:
if ((fpPek = fopen("cd-register.txt", "a")) == NULL)
{
printf("Filen kunde inte \x94ppnas\n\n");
exit(1);
}
skrivaPost(fpPek);
break;
case 3:
if ((fpPek = fopen("cd-register.txt", "w+")) == NULL)
{
printf("Filen kunde inte \x94ppnas\n\n");
exit(1);
}
raderaPost(fpPek);
break;
case 4: sorteraRegister();
break;
case 5: printf("Du har angett att du vill avsluta registret\n\n");
fclose(fpPek); // stäng filen så att den inte är öppen om jag av misstag har öppnat den
exit(0);
break;
default: printf("Du har angett ett felaktigt menyval!\n");
printf("Ange nytt v\x84rde!\n\n");
break;
}
}
// Lite avslutande text
printf("\nTack f\x94r att du har anv\x84nt detta program, hejd\x86!\n\n");
return(0);
}
/* Funktionerna börjar här */
/*
*
*
*/
/* Denna funktion skriver ut informationstext för att användaren skall förstå programmets
funktion och vad denna skall göra för att programmet skall utföra det användaren vill */
void skrivInformation(void)
{
printf("V\x84lkommen till programmet CD-Registret:\n\n");
printf("H\x84r kan du skriva vilka in cd-skivor du har och sedan kan s\x94ka p\x86\n");
printf("dom eller ta bort ur registret. V\x84lj vad du vill g\x94ra ur menyn nedan.\n\n");
}
/*
*
/*
/* Denna funktion skriver ut menyn för programmet */
void menyVal(void)
{
printf(" 1 Visa cd-registret\n");
printf(" 2 Skriv in en ny titel\n");
printf(" 3 Ta bort en titel\n");
printf(" 4 Sortera CD-registret\n");
printf(" 5 Avsluta cd-registret\n");
}
/*
*
*/
/* Denna funktion öppnar registret för listning av alla posterna */
void oppnaRegister(fpPek)
{
// Variabel och pekar deklaration och tilldelning
char cFilData;
// Nu läser vi in filens innehåll och skriver ut den
printf("\nDessa poster finns i cd-registret.\n");
while((cFilData = fgetc(fpPek)) != EOF)
{
putchar(cFilData);
}
// Skriv ut några tomrader för snygggare visning och stäng sedan filen
printf("\n\n");
fclose(fpPek);
}
/*
*
*/
/* Denna funktion ger användaren möjlighet att skriva till registret och addera poster */
void skrivaPost(fpPek)
{
// Variabel och pekar deklaration och tilldelning
char sArtist[201];
char sTitel[201];
char cRunState = 'j';
int *iAntalPoster;
iAntalPoster = malloc(sizeof(int));
*iAntalPoster = 0;
// Nu skall vi hämta in artist och titeln på skivan
while ((cRunState == 'j') || (cRunState == 'J'))
{
// Nu hämtar vi in artisten och titeln ifrån användaren
printf("\nSkriv in artist och skivtitel (max 200 tecken), avsluta med enter.\n");
printf("Ange artist: ");
gets_s(sArtist, 200);
fflush(stdin);
printf("Ange titel: ");
gets_s(sTitel, 200);
fflush(stdin);
// Nu skriver vi detta till filen
fprintf_s(fpPek, "%s\n", sArtist);
fprintf_s(fpPek, "%s\n\n", sTitel);
// Nu frågar vi om vi vill skriva in fler poster
printf("\n\nVill du skriv in fler titlar, j/n? ");
scanf_s("%c", &cRunState);
fflush(stdin);
*iAntalPoster += 1;
}
printf("Du skrev in %d poster denna g\x86ng\n\n", *iAntalPoster);
fclose(fpPek);
/* Nu frigör vi minnet och pekar alla pekare på NULL så att dom inte
av misstag ändrar något som inte skall påverkas */
free(iAntalPoster);
iAntalPoster = NULL;
}
/*
*
/*
/* Denna funktion ger användaren möjlighet att radera poster i registret */
void raderaPost(void)
{
// Variabel och pekar deklaration och tilldelning
char sRaderaArtist[201];
char sRaderaTitel[201];
char cRunState = 'j';
// Nu skall vi hämta in artist och titeln på skivan
while ((cRunState == 'j') || (cRunState == 'J'))
{
// Nu hämtar vi in artisten och titeln ifrån användaren
printf("\nSkriv in artist och skivtitel (max 200 tecken), som du vill radera\n");
printf("Avsluta varje inmatning med enter.\n");
printf("Ange artist: ");
gets_s(sRaderaArtist, 200);
fflush(stdin);
printf("Ange titel: ");
gets_s(sRaderaTitel, 200);
fflush(stdin);
// Sök upp och radera posten som skrivits in
// Nu frågar vi om vi vill skriva in fler poster
printf("\n\nVill du radera fler titlar, j/n? ");
scanf_s("%c", &cRunState);
fflush(stdin);
}
}
/*
*
/*
/* Denna funktion sorterar registret efter namn eller titel, beroende på vad användaren väljer */
void sorteraRegister(void)
{
printf("\nFunktionen sorteraRegister\n\n");
}