07. januar 2000 - 11:49Der er
18 kommentarer og 1 løsning
skriv og læs til txt fil.
jeg har et lille problem i et program jeg er ved at lave jeg vil have programmet til at :
når man indtaster en vare som er blevet solgt skriver den automatisk til filen og hopper til starten af programmet igen MEN når mit program skriver til filen går det hele bare i sort og jeg kan skrive en masse på skærmen uden effekt.
her er koden jeg bruger for at skrive i filen :
if (freopen("salg.txt", "w", stdout) == NULL) fprintf(stderr, "error redirecting stdout\n");
cout << "der er følgene på lager : \n\n"; cout << vare1; cout << " af vare1 på lager\n";
fclose(stdout); return 0;
desuden ville jeg lige hører hvad koden er for at læse den fil ind i programmet iden hvor "vare1" så bliver skrever ind igen
desuden ville jeg lige hører om man ikke kunne lave en kode så man salg.txt bliver "dato.txt" hvor den selv lige kigger på datoen og laver så txt filen feks. 010600.txt ??
Undskyld CVSAC, men det virker lidt rodet dit spørgsmål.
Umiddelbart ser det ud som om du åbner salg.txt til stdout der er "standard Output", d.v.s. typisk skærmen. istedet for stdout skal du bruge en fil-var.
Spørgsmålet med at læse filen ind igen forstår jeg ikke !!
og endeligt. Lav filnavnet salg.txt om til en var og sæt den lig med datoen.txt, via en konverteringsrutine, f.eks. datotostr !
I første omgang bør du nok i hvert fald gøre følgende:
FILE* File=freopen("salg.txt", "w", stdout); if (File== NULL) { fprintf(stderr, "error redirecting stdout\n"); return -1; } cout << "der er følgene på lager : \n\n"; cout << vare1; cout << " af vare1 på lager\n"; fclose(stdout); return 0; }
Du får i hvert fald lavet en cout og en fclose selv om din open fejler. Jeg ved ikke om det kan være det?
Men for at gennemskue hvorfor den låser, så bliver du nok nødt til at give lidt mere af din kode, da det er svært at se om fejlen overhovedet er her (bortset fra det jeg allerede har vist dig).
Del 2 af dit spørsmål forstår jeg ikke. Vil du have at læst antallet af vare1 ind i dit program igen? Du kan gøre det at du læser hele filen ind i en buffer, og så laver en:
long Vare1=atol(buffer[strlen("der er følgende på lager : \n\n"]);
Hvis du vel at mærke ikke har skrevet noget i filen FØR dette!
hmmm der er noget galt programmet bliver bare jordet igennem......
det jeg gerne ville kunne med at læse fra filen er feks hvis maskinen går ned vil jeg kunne hive alle salgs tallene ind igen dvs læse fra den "gamle" salg.txt
og hvordan f*nden sætter jeg den dato kode ind så den laver de filer selv ???
husk at skriv det nogen lunde så JEg kan forstå det :))) jeg er nemlig lige startet med c++ :)))))))
I fopen giver jeg option "w", hvilket vil sige, at jeg vil lave en ny fil. Du kan i stedet sætte en option "a", hvilket vil sige, at du vil tilføje til filen. Men så får du selvfølgelig også alle tidligere opdateringer med i filen, og det vil du vel ikke?
En mulighed er, at du skriver alle varer hver gang du skriver i filen, og så overskriver på samme måde som nu.
hmmm jeg får et halvt tons fejl når jeg laver den......
Error:mars.cpp(9,8):Call to undefined function 'time' Error:mars.cpp(10,27):Call to undefined function 'localtime' Error:mars.cpp(10,16):Cannot convert 'int' to 'tm *' Error:mars.cpp(12,67):'tm_year' is not a member of 'tm' Error:mars.cpp(12,93):'tm_mon' is not a member of 'tm' Error:mars.cpp(12,118):'tm_mday' is not a member of 'tm' Warn :mars.cpp(26,2):'CurrentTime' is assigned a value that is never used
mangler jeg en include fil ???
det med flere vare den skal sådan set bare overskrive filen hver gang....
START der er følgende på lager : 1 af vare: mars 1 af vare: snickers SLUT
det er sådan set det men med det program der er lavet nu gidder den kun adde ENTEN mars ELLER snickers (kommaer an på hvad man addede i programmet sidst)
jeg vil have den til at skirve alle dataerne ind med det samme..
Jeg lavede lige et par hurtige ændringer, så du kan se hvordan man kan få den til at skrive flere varer i filen samtidig. Du kan selv prøve at gøre den mere generel, så den ikke er kodet efter, at der skal være præcis to varer, men at man kan have det antal man vil. Du kan også i første omgang prøve bare at sætte en vare mere ind.
Skriv endelig igen, hvis du har flere spørgsmål. Jeg skal nok svare, selv om jeg har fået mine point :-)
ok jeg har nu fået programmet til at skrive til en fil men hvordan fanden får jeg den til at læse fra filen og smide det der står ind i programmet ... ???
jeg skal vel bruge "r" isted for "w" og fscanf istedet for fprintf eller hvad ???
Jeg har ikke brugt fprintf nogen steder i mit program. Det er rigtigt at du skal bruge "r" i stedet for "w", og så kan du bruge fread til at læse fra filen. Det du læser er jo ren tekst, så du skal selv finde frem til tal-værdierne i teksten, og konvertere dem til tal.
Du kan gøre noget i stil med: char Buffer[2000]; FILE* File=fopen(FileName, "r"); int ReadSize=fread(Buffer, 2000, 1, FileHandle); int CurPos; while (CurPos<ReadSize && Buffer[CurPos]!='\n') CurPos++; CurPos++; if (CurPos>=ReadSize) return false; int Vare=atol(Buffer[CurPos]); ... // OSV!
jeg tror snart jeg skriger og hiver min hovedbund af :)))
jeg kan bare ikke få det lort til at virke ::(
selve txt filen er opbygget sådan her : START : der er solgt følgene :
1 af vare: Mars
Der er følgene på Lager :
9 af vare: mars
SLUT
hvordan fanden får jeg det første tal til at blive lagt sammen med int mars og hvordan får jeg den sidste til at værer lagt sammen med int marslager ????
Jeg går ud fra, at dit store problem er at få parset din tekstfil, og få konverteret de to værdier til integers?
Umiddelbart vil jeg sige, at du ikke skal bruge en tekstfil, da du så skal lave en ret intelligent parser. Du skal i stedet lave en datafil, og den kan du så bruge til at generere rapporter, i stil med den fil du har nu. En tekstfil er ikke specielt velegnet til at putte data i, og hente data op fra igen, og samtidig få det til at stå pænt i filen.
Hvis du i stedet lavede en datafil, ville det være voldsomt nemt at skrive og læse filen. Og hvis du så gerne ville have en pæn tekst-fil som den du har nu, så kan du lave en rapport-genererings funktion, som laver denne fil.
Du kunne fx. lave følgende format for din datafil:
antal_varer_i_filen // int // for hver vare: vare_navn // streng på 50 vare_id // int
antal_varer_paa_lager // int // for hver vare på lager: vare_id // int vare_antal // int
antal_vare_solgt // int // for hver vare solgt: vare_id // int vare_antal // int
Din loader funktion vil så se således ud:
int AntalVarer; int AntalSolgt; int AntalLager; char VareNavn[50]; int Antal; int VareId; FileHandle=fopen(FileName, "rb"); fread(&AntalVarer, sizeof(int), 1, FileHandle); for (int i=0; i<AntalVarer; i++) { fread(VareNavn, 50, 1, FileHandle); fread(VareId, sizeof(int), 1, FileHandle); // Tilføj varen til en liste af varer! } fread(&AntalLager, sizeof(int), 1, FileHandle); for (int i=0; i<AntalLager; i++) { fread(VareId, sizeof(int), 1, FileHandle); fread(Antal, sizeof(int), 1, FileHandle); // Registrer lageret et-eller-andet sted } fread(&AntalSolgte, sizeof(int), 1, FileHandle); for (int i=0; i<AntalSolgte; i++) { fread(VareId, sizeof(int), 1, FileHandle); fread(Antal, sizeof(int), 1, FileHandle); // Registrer salget et-eller-andet sted } fclose(FileHandle);
Jeg har skrevet koden direkte her på eksperten, og har derfor ikke prøvet at køre det. Så der er nok et par fejl, men du skulle gerne kunne se meningen med det nu? Du kan selv prøve at rode lidt med en rapport-udskrivnings funktion.
bool WriteVare(int Mars, char* MarsVareNavn, int Snickers, char* SnickersVareNavn, int lion, char* lionvarenavn, int raider, char* raidervarenavn, int bounty, char* bountyvarenavn, int hekse, char* heksevarenavn, int skummus, char* skummusvarenavn, int sour, char* sourvarenavn, int bolge, char* bolgevarenavn, int barberque, char*barberquevarenavn, int marslager, char* marslagernavn, int snickerslager, char* snickerslagernavn, int lionlager, char* lionlagernavn, int raiderlager, char* raiderlagernavn, int bountylager, char* bountylagernavn, int hekselager, char* hekselagernavn, int skummuslager, char* skummuslagernavn, int sourlager, char* sourlagernavn, int bolgelager, char* bolgelagernavn, int barberquelager, char* barberquelagernavn) { struct tm *CurrentTime; long TimeVal; time(&TimeVal); CurrentTime = localtime(&TimeVal); char FileNameBuffer[1000]; sprintf(FileNameBuffer, "%.4d%.2d%.2d.txt", CurrentTime->tm_year+1900, CurrentTime->tm_mon+1, CurrentTime->tm_mday);
FILE* File=fopen(FileNameBuffer, "w"); if (File==NULL) { fprintf(stderr, "error opening file!\n"); return false; } int l; char Buffer[1000]; l=sprintf(Buffer, "der er solgt følgene :\n\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n\n\n\nDer er følgene på Lager :\n\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n%d af vare: %s\n ",Mars, MarsVareNavn, Snickers, SnickersVareNavn, lion, lionvarenavn, raider, raidervarenavn, bounty, bountyvarenavn, hekse, heksevarenavn, skummus, skummusvarenavn, sour, sourvarenavn, bolge, bolgevarenavn, barberque, barberquevarenavn, marslager, marslagernavn, snickerslager, snickerslagernavn, lionlager, lionlagernavn, raiderlager, raiderlagernavn, bountylager, bountylagernavn, hekselager, hekselagernavn, skummuslager, skummuslagernavn, sourlager, sourlagernavn, bolgelager, bolgelagernavn, barberquelager, barberquelagernavn); fwrite(Buffer, l, 1, File); fclose(File); return true; }
void MainMenu() { int x; int Mars=0; int Snickers=0; int lion=0; int raider=0; int bounty=0; int hekse=0; int skummus=0; int sour=0; int bolge=0; int barberque=0;
int marslager=0; int snickerslager=0; int lionlager=0; int raiderlager=0; int bountylager=0; int hekselager=0; int skummuslager=0; int sourlager=0; int bolgelager=0; int barberquelager=0; while (true) { printf("Hvor mange mars er der på lager ? : "); cin >> marslager; printf("Hvor mange snickers er der på lager ? : "); cin >> snickerslager; printf("Hvor mange lionbar er der på lager ? : "); cin >> lionlager; printf("Hvor mange raiders er der på lager ? : "); cin >> raiderlager; printf("Hvor mange bounty er der på lager ? : "); cin >> bountylager; printf("Hvor mange heksehyl er der på lager ? : "); cin >> hekselager; printf("Hvor mange skummus er der på lager ? : "); cin >> skummuslager; printf("Hvor mange sourcream chips er der på lager ? : "); cin >> sourlager; printf("Hvor mange bølge chips er der på lager ? : "); cin >> bolgelager; printf("Hvor mange barberque chips er der på lager ? : "); cin >> barberquelager; start: clrscr(); printf("tast 1 for mars :\n" "tast 2 for snickers :\n" "tast 3 for Lion Bar :\n" "tast 4 for Raider :\n" "tast 5 for bounty :\n" "tast 6 for heksehyl :\n" "tast 7 for smummus :\n" "tast 8 for sourcream chips :\n" "tast 9 for bølge chips :\n" "tast 10 for barberque chips :\n" "tast 0 for afslut\n"); cin >> x; if (x==0) break; if (x==1) {Mars++; marslager=marslager-1;} if (x==2) {Snickers++; snickerslager=snickerslager-1;} if (x==3) {lion++; lionlager=lionlager-1;} if (x==4) {raider++; raiderlager=raiderlager-1;} if (x==5) {bounty++; bountylager=bountylager-1;} if (x==6) {hekse++; hekselager=hekselager-1;} if (x==7) {skummus++; skummuslager=skummuslager-1;} if (x==8) {sour++; sourlager=sourlager-1;} if (x==9) {bolge++; bolgelager=bolgelager-1;} if (x==10) {barberque++; barberquelager=barberquelager-1;} if (!WriteVare(Mars, "Mars", Snickers, "Snickers", lion, "Lionbar", raider, "Raider", bounty, "Bounty", hekse, "Heksehyl", skummus, "skummus", sour, "Sourcream Chips", bolge, "Bølge salt", barberque, "barberque", marslager, "mars", snickerslager, "snickers", lionlager, "lionbar", raiderlager, "raider", bountylager, "bounty", hekselager, "heksehyl", skummuslager, "skummus", sourlager, "sourcream chips", bolgelager, "bølge chips", barberquelager, "barberque chips" )) return; goto start; }
Jeg ved ikke om du har bemærket det, men din WriteVare funktion er blevet fuldstændig latterlig med alle de parametre. Det kan laves en hel del smartere...
Hvis du laver et array, og så løber det igennem i stedet for at have en miliard parametre til funktionen, så vil det være meget nemmere at forstå, meget nemmere at kode og meget nemmere at overskue.
Jeg har ikke lige tid til at gøre det lige nu, men prøv selv at arbejde lidt med det.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.