Avatar billede cvsac Nybegynder
07. januar 2000 - 11:49 Der 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 ??

Avatar billede sjensen Nybegynder
07. januar 2000 - 12:14 #1
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 !

sjensen
Avatar billede dmk Nybegynder
07. januar 2000 - 12:28 #2
Hejsa

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!

Den sidste del af spørgsmålet kan løses sådan:

  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);

Dit filnavn vil derefter være i FileNameBuffer.


DMK
Avatar billede cvsac Nybegynder
07. januar 2000 - 12:56 #3
#include <conio.h>
#include <stdio.h>
#include <iostream.h>

int main()
{
  int x;
  int vare1;
  vare1=0;


  start:


  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 1;
  a:
  clrscr();
  cout << "tast 1 for mars\n";
  cin >> x;

  if (x==1)
    {
    vare1=vare1+1;
    goto start;
    }


  }


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++ :)))))))
Avatar billede dmk Nybegynder
07. januar 2000 - 13:31 #4
Jeg har lavet en smule om i dit program, og det ser nu sådan ud:

bool WriteVare(int vare, char* VareNavn)
{
  FILE* File=fopen("salg.txt", "w");
  if (File==NULL)
  {
    fprintf(stderr, "error opening file!\n");
    return false;
  }
  int l;
  char Buffer[1000];
  l=sprintf(Buffer, "der er følgende på lager : %d\n af vare: %s\n",vare, VareNavn);
  fwrite(Buffer, l, 1, File);
  fclose(File);
  return true;
}

void MainMenu()
{
  int x;
  int vare1=0;
  do
  {
    printf("tast 1 for mars\ntast 0 for afslut\n");
    cin >> x;

    if (x==1)
    {
      vare1=vare1+1;
      if (!WriteVare(vare1, "mars")) return;
    }
  }
  while (x!=0);
}

int main()
{
  MainMenu();
  return 0; 
}


Prøv om du forstår hvad jeg har lavet, og skriv tilbage. Det virker i hvert fald fint her.

DMK
Avatar billede cvsac Nybegynder
07. januar 2000 - 14:22 #5
ok....................

hvordan får jeg den nu til at skrive flere linjer i filen ??

feks mars, snicers osv. ??

jeg prøvede men den gad ikke skrive mere en en vare :(((

og hvordan får jeg sat txt filen til at hedde datoen ???
og eventuelt indlæse de tal der er i filen hvis nu at programmet går ned ?
Avatar billede dmk Nybegynder
07. januar 2000 - 14:37 #6
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.

DMK
Avatar billede dmk Nybegynder
07. januar 2000 - 15:43 #7
Hvis du vil have at filen hedder datoen, så kan du bytte WriteVare funktionen ud med følgende:

bool WriteVare(int vare, char* VareNavn)
{
  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 følgende på lager : %d\n af vare: %s\n",vare, VareNavn);
  fwrite(Buffer, l, 1, File);
  fclose(File);
  return true;
}


DMK
Avatar billede cvsac Nybegynder
07. januar 2000 - 16:12 #8
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....
Avatar billede dmk Nybegynder
07. januar 2000 - 16:14 #9
Ja, du mangler nok følgende include:

#include <time.h>

DMK
Avatar billede cvsac Nybegynder
07. januar 2000 - 17:27 #10
hmmm hvordan fanden får jeg den til at skrive mere end en vare ind i txt filen ???
Avatar billede bjarke Nybegynder
07. januar 2000 - 17:48 #11
Find først ud af hvordan dataene skal gemmes i filen (kommasepareret, linieskift, tabulatorsepareret, andet).

Jeg har aldrig brugt fwrite, men med fprintf kan du lave noget lignende:

do
  fprintf(filepointer, "%s\n", varenavn);  // hvor varenavn er en streng og \n er et linieskift
while( something );
Avatar billede cvsac Nybegynder
07. januar 2000 - 22:13 #12
dataen skal smides ind sådan :

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..
Avatar billede dmk Nybegynder
10. januar 2000 - 10:39 #13
Hej igen.

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 :-)

DMK

bool WriteVare(int Mars, char* MarsVareNavn, int Snickers, char* SnickersVareNavn)
{
  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 følgende på lager :\n %d af vare: %s\n %d af vare: %s\n",Mars, MarsVareNavn, Snickers, SnickersVareNavn);
  fwrite(Buffer, l, 1, File);
  fclose(File);
  return true;
}



//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void MainMenu()
{
  int x;
  int Mars=0;
  int Snickers=0;
  while (true)
  {
    printf("tast 1 for mars\n"
          "tast 2 for snickers\n"
          "tast 0 for afslut\n");
    cin >> x;
    if (x==0) break;
    if (x==1)
    Mars++;
    if (x==2)
    Snickers++;
    if (!WriteVare(Mars, "Mars", Snickers, "Snickers")) return;
  }
}

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main()
{
  MainMenu();
  return 0; 
}

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Avatar billede cvsac Nybegynder
11. januar 2000 - 18:37 #14
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 ???

Avatar billede dmk Nybegynder
11. januar 2000 - 19:08 #15
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!

Prøv selv at arbejde lidt videre med det.

DMK
Avatar billede cvsac Nybegynder
13. januar 2000 - 11:37 #16
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 ????
Avatar billede dmk Nybegynder
13. januar 2000 - 11:50 #17
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.

DMK
Avatar billede cvsac Nybegynder
21. januar 2000 - 11:40 #18
ok det forstod jeg ikke meget af og nu er jeg virligt lost..


jeg kan slet ikke se det nu....

kan du ikkr prøve at smide det ind i det jeg har har fået lavet indtil videre ???

#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <time.h>

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;
  }

}

int main()
{
  MainMenu();
  return 0; 
}
Avatar billede dmk Nybegynder
21. januar 2000 - 12:05 #19
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.

Hvis du fx. laver din parameter sådan her:

#define ANTAL_VARER 40
#define VARENAVN_LAENGDE 100

struct VareListe{
char VareNavne[ANTAL_VARER][VARENAVN_LAENGDE];
int  VareSalg[ANTAL_VARER];
int Antal;
};

WriteVare(VareListe &Varer)

Så vil du kunne løbe listen af varer igennem med en for-løkke, som tæller fra 0 til Antal, og indekserer ind i VareNavne og VareSalg:

for (int i=0; i<Varer.Antal; i++)
...
  sprintf(Buffer .... , Varer.VareNavne[i], Varer.VareSalg[i]);
fwrite(Buffer);

Eller noget i den stil?

DMK
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester