Avatar billede cvsac Nybegynder
10. februar 2000 - 17:46 Der er 14 kommentarer og
1 løsning

læse nogle INTs fra en fil

jeg har en txt fil jeg gerne vil læse fra men hvordan ?

filen ser således ud :
----------------------
der er solgt følgene :

1 af vare: cola
2 af vare: Mars
----------------------
hvordan får jeg feks colaerne indlæst til feks int colaold;
og mars til int marsold;
osv.

i bliver nød til at skærer det MEGET ud i pap da jeg ikke er så god eventuelt med et eksempel....

Tak på forhånd
Avatar billede dmk Nybegynder
10. februar 2000 - 18:33 #1
Du kan gøre det på følgende måde:
#include <stdio.h>

bool ReadFile(int &Cola, int &Mars)
{
  FILE* FileHandle=fopen("minfil.txt", "r");
  if (!FileHandle)
  {
    printf("Error opening file\n");
  }
  char DataBuffer[200];
  bool MarsFound=false, ColaFound=false;
  int Offset, Length;
  while (gets(FileHandle))  // Så længe der er mere data i filen
  {
    Offset=0;
    Length=strlen(DataBuffer);
    while (Offset<Length && DataBuffer[Offset]!=':') Offset++;
    if (Offset==Length) continue;
    while (Offset<Length && DataBuffer[Offset]!=' ') Offset++;
    if (Offset==Length) continue;
    if (stricmp("cola", DataBuffer[Offset])==0) // hvis cola er fundet i filen
    {
      ColaFound=true;
      Cola=atoi(DataBuffer);
    }
    else if (stricmp("Mars", DataBuffer[Offset])==0) // hvis mars er fundet
  {
    Mars=atoi(DataBuffer);
    MarsFound=true;
  }
  }
  fclose(FileHandle);
  if (!MarsFound  || !ColaFound)
  {
  printf("Kunne ikke finde alle alle varer i filen\");
  return false;
  }
  return true;
}



Det er RIGTIG hurtigt skrevet, og direkte her på eksperten, så jeg ved ikke om det kan køre. Hvis jeg skulle lave det ordentligt, så ville jeg nok prøve at lave det, så funktionen ikke var afhængig af hvor mange varer det drejer sig om, og hvad de præcist hedder. Jeg ved heller ikke om det sådan lige kan compile. Men prøv det, og skriv tilbage! Så ser jeg på det i morgen.

DMK
Avatar billede michaelprehn Nybegynder
10. februar 2000 - 20:54 #2
Denne kode gør noget af det:
Først åbner den file, så læser den en line  ad gangen og uddrager et tal, hvis du forstår den kan du sikkert selv uddrage fra kolonnet og checke på varetypen

#include <iostream.h>
#include <conio.h>
#include <fstream.h>
#include <string.h>

  void main(void)  //
  {
    ifstream fil_ind("C:\\TEKSTFIL.TXT"); // åbner filen
    char linie[81];                      // variabel til en linie tekst
    char substr[81];                      // variabel til delstreng
    int  tal, colaold, marsold;

    while ((!fil_ind.eof())
    {
        fil_ind.getline(linie, sizeof(linie));
        for (int i =0; i < 80; i++)
        {
            if linie[i] == ' '
            {
                linie[i] = '\0';    // nu er linie en streng der stopper ved
                                    // første mellemrum
                int = atoi(linie);  // konverterer stregen til en int
                linie[i] = ' ';    // oprydning !!
                break;              // ud af for løkken
            }     // endif
        }         // endfor
    }                 // end while
  }         // end program


hilsen
michael
Avatar billede soepro Nybegynder
11. februar 2000 - 09:54 #3
Følgende program indlæser dataen til en tabel, og udskriver så denne sorteret efter vare navn. Jeg har anvendt strtok til at finde hvert enkelt "ord" i den linie du læser fra filen - simpelthen ved at adskille dem på blank, eller linie slut (CR+LF = \r\n) På denne måde kan man meget enkelt pille informationerne ud af de ord i linien, men på forhånd ved man skal bruge.

Koden er kørt igennem TC++ 3.0 or fungerer, som den står her:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <mem.h>

const int  maxVarer = 20;
typedef    struct
{
  char    Navn[30];
  char    AntalSolgt;
}          defVare;

int main(int argc, char *argv[])
{
  FILE    *filpointer;
  char    *filnavn    = "\\util\\13.txt";
  char    buffer[257];
  char    *ptrBuffer;
  int      tokenNr, idx, idy;
  defVare  Vare[maxVarer];
  int      antalVarer;
  char    vareNavn[sizeof(Vare[0].Navn)];
  int      solgtAntal;

  // F›rste parameter = fil navn med data.
  if (argc > 1)
    filnavn = argv[1];
  filpointer = fopen(filnavn, "rb");
  if (filpointer == NULL)
  {
    cprintf("\aFilen \'%s\' kunne ikke l‘ses.\r\n", filnavn);
    return -1;
  };

  // S† sus igennem filen og "opsaml" totaler.
  memset(Vare, 0, sizeof(Vare));
  antalVarer = 0;

  while (fgets(buffer, sizeof(buffer), filpointer) != NULL)
  {
    // "Tokenize", dvs. opdel, den l‘ste buffer i bidder adskildt af
    // blank eller linieslut.
    ptrBuffer  = strtok(buffer, " \r\n");
    tokenNr    = 0;
    vareNavn[0] = '\x0';
    solgtAntal  = 0;
    while (ptrBuffer != NULL)
    {
      switch (++tokenNr)
      {
        case 1 : // F›rste bid skal v‘re antal varer solgt.
                // Hvis solgt antal bliver nul, kan vi glemme linien
                if ((solgtAntal = atoi(ptrBuffer)) == 0)
                  // Vil stoppe while loopet, og forts‘tte med n‘ste
                  // linie i filen.
                  tokenNr = 99;
                break;
        case 2 : // Teksten 'af' - den er vi ligeglade med.
        case 3 : // Teksten 'vare:' - den er vi ogs† ligeglade med.
                break;
        case 4 : // Varenavn - det skal vi bruge, og s† skal vi ikke
                // bruge mere af linien. (Konvert‚r til store bogstaver
                // aht. sorteringen af tabellen.)
                strncpy(vareNavn, strupr(ptrBuffer), sizeof(vareNavn)-1);
                tokenNr = 99;
                break;
      } // Token nummer

      // Hvis vi ikke allerede har behandlet sidste token, forts‘t med
      // n‘ste - ellers stop while loop'et
      if (tokenNr < 99)
        ptrBuffer = strtok(NULL, " \r\n");
      else
        ptrBuffer = NULL;
    }; // Mens der stadig er tokens tilbage

    // Hvis vi fandt en vare & et antal solgt, s† "kyl" dem ind i tabel-
    // len - sorteret.
    if (vareNavn[0] != '\x0')
    {
      for (idx = 0; idx <= antalVarer && idx < maxVarer; idx++)
      {
        // Hvis pladsen er tom, eller indeholder samme vare,
        // s† har vi fundet varens plads.
        if (Vare[idx].Navn[0] == '\x0'
        ||  strncmp(Vare[idx].Navn, vareNavn, sizeof(Vare[0].Navn)-1) == 0)
          break;

        // Check om den vare vi lige har fundet, ligger alfabetisk FR
        // det nuv‘rende element. I s† fald, skal resten af tabellen
        // rykkes een plads op, og nuv‘rende plads indeholde den lige
        // fundne vare.
        if (strncmp(Vare[idx].Navn, vareNavn, sizeof(Vare[0].Navn)-1) < 0)
        { // Ryk tabellen op - og nulstil nuv‘rende element.
          for (idy = antalVarer; idy >= idx; idy--)
            Vare[idy+1] = Vare[idy];
          memset(&Vare[idx], 0, sizeof(Vare[0]));
          // Stop loop - plads fundet.
          break;
        };
        // Forts‘t med n‘ste element.
      }; // Alle elementer.

      // Hvis idx er = maxVarer, har vi flere varer en der kan v‘re i tabellen.
      if (idx >= maxVarer)
      { // Skriv fejl - og forts‘t.
        cprintf("\aDer er flere varer, end de %d der er plads til i tabellen.\r\n"
                "Vare \'%s\' (%d antal solgt) kunne ikke gemmes.\r\n",
                maxVarer, vareNavn, solgtAntal);
      } // Ikke mere plads
      else
      { // Plads fundet - eller tilf›jet.
        if (Vare[idx].Navn[0] == '\x0')
          antalVarer++;
        strncpy(Vare[idx].Navn, vareNavn, sizeof(Vare[0].Navn)-1);
        Vare[idx].AntalSolgt += solgtAntal;
      };
    }; // Vare fundet.
  }; // Indtil hele filen er l‘st.

  // Luk filen - og udskriv de opsamlede totaler.
  fclose(filpointer);
  cprintf("Samlede salgstal:\r\n===============\r\n");
  for (idx = 0; idx < antalVarer; idx++)
  {
    cprintf("%-*.*s: %8d\r\n", sizeof(Vare[0].Navn), sizeof(Vare[0].Navn),
                              Vare[idx].Navn, Vare[idx].AntalSolgt);
  };
  return 0;
}
Avatar billede bjarke Nybegynder
11. februar 2000 - 11:55 #4
Hold ta fast. Gang i den!!!

cvsac >> Jeg vil ikke lave et 4. program til dig - ovenstående fungerer sikkert udemærket. Det du skal vide er, at når du indlæser fra en tekstfil, så er du nødt til at vide hvordan dataene er lagret (som du jo også ved). Uden den viden kan man ikke lave et program, som henter dataene.

Dvs, det er bare et spørgsmål om hvilken algoritme man vil bruge til at indlæse dataene efter. Én metode (en ganske primitiv) kunne f.eks. være, at du "kravler" hen til det første tal ved at benytte fscanf() 4 gange. Du vil således stå i filen parat til at indlæse det første tal.
  Du kan så lave en fscanf(filpointer, "%i%s%s%s", &antal, dummy, dummy, &vare) som løber indtil enden af filen er nået - værdierne af dummy ("af" og "vare:") skal således ikke bruges.

Den bedste løsning på opgaven vil så være en eller anden afvejning af hvor hurtig/effektiv din algoritme er og hvor let din kode er at læse/redigere.

Det var lidt om det principielle - håber du kan bruge det.

-Bjarke
Avatar billede cvsac Nybegynder
11. februar 2000 - 13:39 #5
hmm dejlige programmer men jeg fatter ikke lige helt hvordan jeg kan bruge dem i den sammenhæng jeg skal :)))

jeg har lavet dette program med hjælp fra mange mennesker efterhånden :)

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

bool WriteVare(int cola, char*colavarenavn, 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 colalager, char*colalagernavn, 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%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%d af vare: %s\n ",cola, colavarenavn, Mars, MarsVareNavn, Snickers, SnickersVareNavn, lion, lionvarenavn, raider, raidervarenavn, bounty, bountyvarenavn, hekse, heksevarenavn, skummus, skummusvarenavn, sour, sourvarenavn, bolge, bolgevarenavn, barberque, barberquevarenavn, colalager, colalagernavn, 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 y;
  int cola=0;
  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 colalager=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;

  int colalager2=0;
  int marslager2=0;
  int snickerslager2=0;
  int lionlager2=0;
  int raiderlager2=0;
  int bountylager2=0;
  int hekselager2=0;
  int skummuslager2=0;
  int sourlager2=0;
  int bolgelager2=0;
  int barberquelager2=0;
  while (true)
  {
  printf("Hvor mange coler er der på lager ?          : ");
  cin >> colalager;
  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 cola                          :\n"
              "tast 2  for mars                        :\n"
          "tast 3  for snickers                    :\n"
          "tast 4  for Lion Bar                    :\n"
          "tast 5  for Raider                      :\n"
          "tast 6  for bounty                      :\n"
          "tast 7  for heksehyl                    :\n"
          "tast 8  for smummus                      :\n"
          "tast 9  for sourcream chips              :\n"
          "tast 10  for bølge chips                :\n"
          "tast 11 for barberque chips              :\n"
          "tast 20 for at tilføje til lageret     :\n"
          "tast 0 for afslut\n");
    cin >> x;
    if (x==0) break;
    if (x==1)
    {cola++;
    colalager=colalager-1;
    }
    if (x==2)
    {Mars++;
    marslager=marslager-1;
    }
    if (x==3)
    {Snickers++;
    snickerslager=snickerslager-1;
    }
    if (x==4)
    {lion++;
    lionlager=lionlager-1;
    }
    if (x==5)
    {raider++;
    raiderlager=raiderlager-1;
    }
    if (x==6)
    {bounty++;
    bountylager=bountylager-1;
    }
    if (x==7)
    {hekse++;
    hekselager=hekselager-1;
    }
    if (x==8)
    {skummus++;
    skummuslager=skummuslager-1;
    }
    if (x==9)
    {sour++;
    sourlager=sourlager-1;
    }
    if (x==10)
    {bolge++;
    bolgelager=bolgelager-1;
    }
    if (x==11)
    {barberque++;
    barberquelager=barberquelager-1;
    }
    if (x==20)
    {
      printf("tast 1  for cola                          :\n"
              "tast 2  for mars                        :\n"
            "tast 3  for snickers                    :\n"
            "tast 4  for Lion Bar                    :\n"
            "tast 5  for Raider                      :\n"
            "tast 6  for bounty                      :\n"
            "tast 7  for heksehyl                    :\n"
            "tast 8  for smummus                      :\n"
            "tast 9  for sourcream chips              :\n"
            "tast 10  for bølge chips                  :\n"
            "tast 11 for barberque chips              :\n"
            "tast 0 for afslut\n");
    cin >> y;
    if (y==1)
    {
    cout << "hvor mange ? :";
    cin >> colalager2;
    colalager=colalager+colalager2;
    }
    if (y==2)
    {
    cout << "hvor mange ? :";
    cin >> marslager2;
    marslager=marslager+marslager2;
    }
    if (y==3)
    {
    cout << "hvor mange ? :";
    cin >> snickerslager2;
    snickerslager=snickerslager+snickerslager2;
    }
    if (y==4)
    {
    cout << "hvor mange ? :";
    cin >> lionlager2;
    lionlager=lionlager+lionlager2;
    }
    if (y==5)
    {
    cout << "hvor mange ? :";
    cin >> raiderlager2;
    raiderlager=raiderlager+raiderlager2;
    }
    if (y==6)
    {
    cout << "hvor mange ? :";
    cin >> bountylager2;
    bountylager=bountylager+bountylager2;
    }
    if (y==7)
    {
    cout << "hvor mange ? :";
    cin >> hekselager2;
    hekselager=hekselager+hekselager2;
    }
    if (y==8)
    {
    cout << "hvor mange ? :";
    cin >> skummuslager2;
    skummuslager=skummuslager+skummuslager2;
    }
    if (y==9)
    {
    cout << "hvor mange ? :";
    cin >> sourlager2;
    sourlager=sourlager+sourlager2;
    }
    if (y==10)
    {
    cout << "hvor mange ? :";
    cin >> bolgelager2;
    bolgelager=bolgelager+bolgelager2;
    }
    if (y==11)
    {
    cout << "hvor mange ? :";
    cin >> barberquelager2;
    barberquelager=barberquelager+barberquelager2;
    }
    }
    if (!WriteVare(cola, "cola", Mars, "Mars", Snickers, "Snickers", lion, "Lionbar", raider, "Raider", bounty, "Bounty", hekse, "Heksehyl", skummus, "skummus", sour, "Sourcream Chips", bolge, "Bølge salt", barberque, "barberque",colalager, "cola", 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;
}

--------
mit problem er at programmet skal kører på en lille bærbar der har strøm nok til ca 3 sec hvis strømmen går til vores netparty :)

så jeg ville have programmet til at læse den txt fil hvis den allerede fantes for den dag.

jeg har lavet det engang før med "FILE*" et eller andet det var extremt simpelt kan jeg huske og jeg brugte bare nogle "cin >> marsoldfile" og lagde som så til mars med "mars=mars+marsoldfile" men jeg kan ikke huske hvad jeg gjorde sidst så derfor spørg jeg her :))
Avatar billede dmk Nybegynder
07. marts 2000 - 16:52 #6
Du kan nu godt bruge det jeg skrev før til at gøre dette her.

#include <stdio.h>

bool ReadFile(int &Cola, int &Mars,  ..... ALLE DINE VARIABLER DER SKAL LÆSES I FILEN)
{
  FILE* FileHandle=fopen("minfil.txt", "r");
  if (!FileHandle)
  {
    printf("Error opening file\n");
  }
  char DataBuffer[200];
  bool MarsFound=false, ColaFound=false;
  int Offset, Length;
  while (gets(FileHandle))  // Så længe der er mere data i filen
  {
    Offset=0;
    Length=strlen(DataBuffer);
    while (Offset<Length && DataBuffer[Offset]!=':') Offset++;
    if (Offset==Length) continue;
    while (Offset<Length && DataBuffer[Offset]!=' ') Offset++;
    if (Offset==Length) continue;
    if (stricmp("cola", DataBuffer[Offset])==0) // hvis cola er fundet i filen
    {
      ColaFound=true;
      Cola=atoi(DataBuffer);
    }
    else if (stricmp("Mars", DataBuffer[Offset])==0) // hvis mars er fundet
  {
    Mars=atoi(DataBuffer);
    MarsFound=true;
  }

  else if (stricmp(" ....... DEN VARE DU VIL SØGE EFTER!
  {
    DEN VARE DU HAR FUNDET=atoi(DataBuffer);
    VARE DU HAR FUNDET -Found=true;
  }

  }
  fclose(FileHandle);
  if (!MarsFound  || !ColaFound)
  {
  printf("Kunne ikke finde alle alle varer i filen\");
  return false;
  }
  return true;
}



Du skal bare indsætte alle de varenavne og "else if " sætninger du skal bruge.

Det er ikke den pæneste måde at gøre det på, men det er jo i forvejen ikke den pæneste måde det bliver gemt og behandlet på. Hvis du gerne vil have noget mere generelt, som ikke er afhængig af antallet og navnet på en vare, så kan det også lade sige gøre. Men hvis du blot vil have noget der kan virke, så er det her ok.

DMK
Avatar billede soepro Nybegynder
08. marts 2000 - 09:42 #7
Hvis det blot er DET du vil, så er dette efter min mening den mest enkle løsning (og MEGET kortere end noget af det andet ovenfor):
Avatar billede soepro Nybegynder
08. marts 2000 - 10:18 #8
Oooooops !!! (10 tommelfingre) Vi prøver igen:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <mem.h>

typedef int bool;
const int  false    = 0;
const int  true    = 1;

const int  maxVarer = 11;
const char* VareNavn[maxVarer] = { "Cola",
                                  "Mars",
                                  "Snickers",
                                  "Lion Bar",
                                  "Raider",
                                  "Bounty" ,
                                  "Heksehyl",
                                  "Skummus",
                                  "Sourcream chips",
                                  "Bølge chips",
                                  "Barbeque chips"
                                };
const char* FileName = "11434.dat";
typedef struct
{
  int cola;
  int Mars;
  int Snickers;
  int lion;
  int raider;
  int bounty;
  int hekse;
  int skummus;
  int sour;
  int bolge;
  int barberque;
} defLager;
union
{
  defLager FixLager;
  int      TblLager[maxVarer];
} Beholdning;

bool WriteVare(defLager* Lager)
{
  FILE *File;
  if ((File = fopen(FileName, "w+b")) == NULL
  ||  fseek(File, 0, SEEK_SET)        != 0)
  {
    fprintf(stderr, "WriteVare: Lagerbeholdningsfil (%s) kunne IKKE åbnes.\n",
                    FileName);
    return false;
  };

  if (fwrite(Lager, sizeof(*Lager), 1, File) != 1)
  {
    fprintf(stderr, "WriteVare: Lager-beholdning kunne IKKE opdateres.\r\n");
    return false;
  }
  /* Luk just åbnede fil. */
  fclose(File);
  return true;
} /* WriteVare */

bool ReadVare(defLager* Lager)
{
  FILE *File;
  if ((File = fopen(FileName, "a+b")) == NULL
  ||  fseek(File, 0, SEEK_SET)        != 0)
  {
    fprintf(stderr, "ReadVare : Lagerbeholdningsfil (%s) kunne IKKE åbnes/dannes.\n",
                    FileName);
    return false;
  };

  /* Dan tom fil, hvis ingen post kan læses. */
  if (fread(Lager, sizeof(*Lager), 1, File) != 1)
  {
    fclose(File);
    return WriteVare(Lager);
  };
  /* Luk den just læste fil. */
  fclose(File);
  return true;
} /* ReadVare */

void VareMenu(void)
{
  for (int idx = 0; idx < maxVarer; idx++)
    printf("Tast %2d for %-15.15s (Beholdning = %d)\n",
          idx+1, VareNavn[idx], Beholdning.TblLager[idx]);
} /* VareMenu */

int main(void)
{
  int x;

  /* Hent beholdning. */
  memset(&Beholdning, 0, sizeof(Beholdning));
  if (!ReadVare(&Beholdning.FixLager))
    return -1;
  /* menu loop. */
  clrscr();
  x = -1;
  while (x != 0)
  {
    printf("SALG:\n=====\n");
    VareMenu();
    printf("----------------------------------\n"
          "Tast 20 for at tilføje til lageret\n"
          "Tast 0  for at afslutte\n");
    cin >> x;
    switch (x)
    {
      case 0  : /* Afslut. */
                break;
      case 20 : /* Tilføj til beholdning. */
                clrscr();
                x = -1;
                while (x != 0)
                {
                  printf("TILFØJ TIL LAGER:\n=================\n");
                  VareMenu();
                  printf("----------------------\n"
                        "Tast 0 for at afslutte\n");
                  cin >> x;
                  if (x >= 1 && x <= maxVarer)
                  {
                    Beholdning.TblLager[x-1]++;
                    WriteVare(&Beholdning.FixLager);
                  }
                  else
                  {
                    if (x != 0)
                      printf("FEJL: %d er IKKE et gyldigt varenummer.\n", x);
                  };
                };
                /* Ydre while skal jo fortsætte. */
                x = -1;
                break;
      default : /* Salg af vare nummer x. */
                if (x >= 1 && x <= maxVarer)
                {
                  if (Beholdning.TblLager[x-1] > 0)
                  {
                    Beholdning.TblLager[x-1]--;
                    WriteVare(&Beholdning.FixLager);
                  }
                  else
                    printf("FEJL: Ikke flere tilbage af vare nr. %d\n", x);
                }
                else
                  printf("FEJL: %d er IKKE et gyldigt varenummer.\n", x);
                break;
    }; /* Switch */
  }; /* while */

  return 0;
} /* Main */
Avatar billede soepro Nybegynder
08. marts 2000 - 10:39 #9
Læg mærke til at WriteVare selv åbner, opdaterer og lukker filen igen. Hver gang du ændrer på beholdningerne, laves bevidst WriteVare. Dette sikrer at din harddisk altid er opdateret med de sidste nye tal - også selvom strømmen svigter midt i det hele. (Det skal gå stærkt hvis strømsvigtet skal nå at komme mellem din indtastning og opdateringen af harddisken.)

Den formaterede udskrift du starter med at beskrive kan meget enkelt laves ud fra d.o.:

void WriteLagerStatus(void)
{
  fprintf(stdprn, "Der er solgt følgende:\n======================\n");
  for (int idx = 0; idx < maxVarer; idx++)
    fprintf(stdprn, "%d af Vare: %.15s\n", Beholdning.Tbl.Solgt[idx], VareNavn[idx]);
  fprintf(stdprn, "Beholdning er:\n==============\n");
  for (int idx = 0: idx < maxVarer; idx++)
    fprintf(stdprn, "%d af Vare; %.15s\n", Beholdning.Tbl.Lager[idx], VareNavn[idx]);
  fprintf(stdprn, "--Slut på udskrift--");
} /* VareLagerStatus*/

Du skal selvfølgelig så opdatere defLager struct'en med et ekstra antal til de solgte varer:

struct
{
  int cola;
  int mars;
  :
  int barberque;
  int colaSolgt;
  int marsSolgt;
  :
  int barberqueSolgt;
} defLager;
union
{
  defLager FixLager;
  struct
  { 
    int Lager[maxVarer];
    int Solgt[maxVarer];
  } TBL;
} Beholdning;

- og opdatere dem samtidigt med at du nedtæller lagerbeholdningen:

  Beholdning.Tbl.Lager[x-1]--;
  Beholdning.Tbl.Solgt[x-1]++;

Bemærk den ekstra struct i union definitionen - den er nødvendig for at angive at de to tabeller (Lager & Solgt) ligger i "rumpen" på hinanden.
Avatar billede soepro Nybegynder
08. marts 2000 - 11:02 #10
Skidt - det jo 300 point ! Så kommer programmet til at se sådan her ud:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <mem.h>

typedef int bool;
const int  false    = 0;
const int  true    = 1;

const int  maxVarer = 11;
const char* VareNavn[maxVarer] = { "Cola",
                                  "Mars",
                                  "Snickers",
                                  "Lion Bar",
                                  "Raider",
                                  "Bounty" ,
                                  "Heksehyl",
                                  "Skummus",
                                  "Sourcream chips",
                                  "Bølge chips",
                                  "Barbeque chips"
                                };
const char* FileName = "11434.dat";
typedef struct
{
  /* På lager */
  int cola;
  int mars;
  int snickers;
  int lion;
  int raider;
  int bounty;
  int hekse;
  int skummus;
  int sour;
  int bolge;
  int barbeque;
  /* Solgt */
  int colaSolgt;
  int marsSolgt;
  int snickersSolgt;
  int lionSolgt;
  int raiderSolgt;
  int bountySolgt;
  int hekseSolgt;
  int skummusSolgt;
  int sourSolgt;
  int bolgeSolgt;
  int barbequeSolgt;
} defLager;
union
{
  defLager FixLager;
  struct
  {
    int    Lager[maxVarer];
    int    Solgt[maxVarer];
  }        Tbl;
} Beholdning;

bool WriteVare(defLager* Lager)
{
  FILE *File;
  if ((File = fopen(FileName, "w+b")) == NULL
  ||  fseek(File, 0, SEEK_SET)        != 0)
  {
    fprintf(stderr, "WriteVare: Lagerbeholdningsfil (%s) kunne IKKE åbnes.\n",
                    FileName);
    return false;
  };

  if (fwrite(Lager, sizeof(*Lager), 1, File) != 1)
  {
    fprintf(stderr, "WriteVare: Lager-beholdning kunne IKKE opdateres.\r\n");
    return false;
  }
  /* Luk just åbnede fil. */
  fclose(File);
  return true;
} /* WriteVare */

bool ReadVare(defLager* Lager)
{
  FILE *File;
  if ((File = fopen(FileName, "a+b")) == NULL
  ||  fseek(File, 0, SEEK_SET)        != 0)
  {
    fprintf(stderr, "ReadVare : Lagerbeholdningsfil (%s) kunne IKKE åbnes/dannes.\n",
                    FileName);
    return false;
  };

  /* Dan tom fil, hvis ingen post kan læses. */
  if (fread(Lager, sizeof(*Lager), 1, File) != 1)
  {
    fclose(File);
    return WriteVare(Lager);
  };
  /* Luk den just læste fil. */
  fclose(File);
  return true;
} /* ReadVare */

void VareMenu(void)
{
  for (int idx = 0; idx < maxVarer; idx++)
    printf("Tast %2d for %-15.15s (Beholdning = %d)\n",
          idx+1, VareNavn[idx], Beholdning.Tbl.Lager[idx]);
} /* VareMenu */

void WriteLagerStatus(void)
{
  int idx;
  FILE *prn;
  if ((prn = fopen("11434.prn", "a+t")) == NULL)
  {
    fprintf(stderr, "WriteLagerStatus: Kunne ikke åbne PRINTER.\n");
    return;
  };
  fprintf(prn, "Der er solgt følgende:\n======================\n");
  for (idx = 0; idx < maxVarer; idx++)
    fprintf(prn, "%d af Vare: %.15s\n", Beholdning.Tbl.Solgt[idx], VareNavn[idx]);
  fprintf(prn, "Beholdning er:\n==============\n");
  for (idx = 0; idx < maxVarer; idx++)
    fprintf(prn, "%d af Vare: %.15s\n", Beholdning.Tbl.Lager[idx], VareNavn[idx]);
  fprintf(prn, "--Slut på udskrift--\xC");
  fclose(prn);
} /* WriteLagerStatus*/

int main(void)
{
  int x;

  /* Hent beholdning. */
  memset(&Beholdning, 0, sizeof(Beholdning));
  if (!ReadVare(&Beholdning.FixLager))
    return -1;

  /* menu loop. */
  clrscr();
  x = -1;
  while (x != 0)
  {
    printf("SALG:\n=====\n");
    VareMenu();
    printf("----------------------------------\n"
          "Tast 20 for at tilføje til lageret\n"
          "Tast 21 for at udskrive status liste\n"
          "Tast 0  for at afslutte\n");
    cin >> x;
    switch (x)
    {
      case 0  : /* Afslut. */
                break;
      case 21 : /* Udskriv status/salgsliste */
                WriteLagerStatus();
                clrscr();
                break;
      case 20 : /* Tilføj til beholdning. */
                clrscr();
                x = -1;
                while (x != 0)
                {
  {
    printf("SALG:\n=====\n");
    VareMenu();
    printf("----------------------------------\n"
          "Tast 20 for at tilføje til lageret\n"
          "Tast 21 for at udskrive status liste\n"
          "Tast 0  for at afslutte\n");
    cin >> x;
    switch (x)
    {
      case 0  : /* Afslut. */
                break;
      case 21 : /* Udskriv status/salgsliste */
                WriteLagerStatus();
                clrscr();
                break;
      case 20 : /* Tilføj til beholdning. */
                clrscr();
                x = -1;
                while (x != 0)
                {
                  printf("TILFØJ TIL LAGER:\n=================\n");
                  VareMenu();
                  printf("----------------------\n"
                        "Tast 0 for at afslutte\n");
                  cin >> x;
                  if (x >= 1 && x <= maxVarer)
                  {
                    Beholdning.Tbl.Lager[x-1]++;
                    WriteVare(&Beholdning.FixLager);
                    clrscr();
                  }
                  else
                  {
                    if (x != 0)
                      printf("FEJL: %d er IKKE et gyldigt varenummer.\n", x);
                  };
                };
                /* Ydre while skal jo fortsætte. */
                clrscr();
                x = -1;
                break;
      default : /* Salg af vare nummer x. */
                if (x >= 1 && x <= maxVarer)
                {
                  if (Beholdning.Tbl.Lager[x-1] > 0)
                  {
                    Beholdning.Tbl.Lager[x-1]--;
                    Beholdning.Tbl.Solgt[x-1]++;
                    WriteVare(&Beholdning.FixLager);
                    clrscr();
                  }
                  else
                    printf("FEJL: Ikke flere tilbage af vare nr. %d\n", x);
                }
                else
                  printf("FEJL: %d er IKKE et gyldigt varenummer.\n", x);
                break;
    }; /* Switch */
  }; /* while */

  return 0;
} /* Main */

Jeg har smidt printet til en fil - så kan du lave "copy 11434.prn lpt1" hvis du vil have den på papir.
Avatar billede soepro Nybegynder
08. marts 2000 - 11:03 #11
Og lad os så få nogle point !!
Avatar billede bjarke Nybegynder
09. marts 2000 - 10:26 #12
Har du ikke noget liv soepro? ;-)
Avatar billede cvsac Nybegynder
09. marts 2000 - 18:32 #13
når jeg compiler den i min dejlige borland c++ 3.0 til DOS syntes den at der mangler en masse } faktisk 3 stk

hvor fanden skal de sættes ind `?
Avatar billede soepro Nybegynder
13. marts 2000 - 09:49 #14
Mit eksempel er direkte klippet ind fra TC++ 3.0, så koden skulle være god nok. Jeg vil umiddelbart to at dit problem skyldes at din compiler ikke tillader "nested comments". Prøv derfor at fjerne alle kommentarer, og se om det ikke hjælper. HVIS det hjælper, skal du lede efter en option i opsætningen af compileren der hedderr "Allow nested comments".
Avatar billede cvsac Nybegynder
14. marts 2000 - 16:08 #15
det var nu ikke det problemet var :)) men jeg har da fået det til at virke :)

så nu vil jeg dele nogle point ud :)
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