Läsa in från .txt fil och avsluta när arrayn är full - C prog.

Permalänk
Medlem

Läsa in från .txt fil och avsluta när arrayn är full - C prog.

Halloj,
Suttit med denna i några timmar nu och kommer ingenstans...

Jag ska läsa in data från en .txt fil och lagra i en struct array. Den fungerar utan problem, men jag vill ändra så att den slutar läsa in från filen när arrayn är full. Exempelvis om storleken på arrayn är 10 och filen innehåller 15 items så ska den sluta läsa in efter 10 och informera användaren om det. Har testat alla möjliga loopar men kommer tyvärr ej fram till något.

Jag bifogar endast den relevanta koden.
Vet hur man bifogar en kod på rätt sätt, så ursäkta indenteringen.

#define MAX 50 int main(){ Car a[MAX]; int choice; int n=0; char mFile[MAX]; printf("Filename: "); fscanf(stdin,"%s",mFile); strcat(mFile,".txt"); readF(a, &n,mFile); } void readF (Car a[], int *pN, const char *fileN){ FILE *fp; fp=fopen(fileN,"r"); if(fp!=NULL){ char name[NAMELENGTH]; int itemNmr, inv; while(fscanf(fp,"%d %s %d", &itemNmr, &name, &inv)==3){ a[*pN]=createCarIt(itemNmr,name,inv); (*pN)++; } fclose(fp); } }

Permalänk
Medlem

Du kan avsluta en loop med break.

För att klistra in kod här så kan du använda code-taggar:
[code]
Kod här
[/code]

Permalänk
Medlem

Har redigerat nu, tack! Det vet jag men jag behöver en loop först:D du kanske menade while-loopen. Jag behöver nog en for-loop som håller koll på antalet i arrayen och sedan avslutar när arrayen är full. Men har testat flera olika variant, inget fungerar.

Permalänk
Medlem
Skrivet av lal27:

Har redigerat nu, tack! Det vet jag men jag behöver en loop först:D du kanske menade while-loopen. Jag behöver nog en for-loop som håller koll på antalet i arrayen och sedan avslutar när arrayen är full. Men har testat flera olika variant, inget fungerar.

Du behöver absolut ingen extra loop. Vad du däremot behöver är en räknare som håller reda på antalet inlästa tecken, och att avbryta din while loop när arrayen är full.

Permalänk
Medlem
Skrivet av lal27:

Har redigerat nu, tack! Det vet jag men jag behöver en loop först:D du kanske menade while-loopen. Jag behöver nog en for-loop som håller koll på antalet i arrayen och sedan avslutar när arrayen är full. Men har testat flera olika variant, inget fungerar.

Du håller redan koll på antalet i arrayen, hur vet du annars var i arrayen du ska placera nästa inlästa data?

Permalänk
Medlem
Skrivet av Erik_T:

Du behöver absolut ingen extra loop. Vad du däremot behöver är en räknare som håller reda på antalet inlästa tecken, och att avbryta din while loop när arrayen är full.

om ingen loop tänker du då en variabel som int count=0; som blir count++; varje gång en läggs till?

Permalänk
Medlem
Skrivet av lal27:

om ingen loop tänker du då en variabel som int count=0; som blir count++; varje gång en läggs till?

Det verkar väl vara ett vettigt sätt att hålla reda på hur många som lags till, eller hur?

Permalänk
Medlem
Skrivet av lal27:

om ingen loop tänker du då en variabel som int count=0; som blir count++; varje gång en läggs till?

Det borde väl bara vara att du initierar den variabeln som 0 och sen lägger till ett villkor för while att den bryter vid ett visst värde, och sen räknar du bara upp den varje lopp i while.

Permalänk
Medlem
Skrivet av Erik_T:

Det verkar väl vara ett vettigt sätt att hålla reda på hur många som lags till, eller hur?

har redan testat. jag hade count++; efter (*pN)++; men efter att jag har skrivit in filnamnet körs inte koden. När jag debugar får jag ett breakpoint vid a[*pN]=createCarIt(itemNmr,name,inv);

Permalänk
Medlem
Skrivet av lal27:

har redan testat. jag hade count++; efter (*pN)++; men efter att jag har skrivit in filnamnet körs inte koden. När jag debugar får jag ett breakpoint vid a[*pN]=createCarIt(itemNmr,name,inv);

Var har du definierat count då?

Permalänk
Medlem
Skrivet av Leffe_B:

Det borde väl bara vara att du initierar den variabeln som 0 och sen lägger till ett villkor för while att den bryter vid ett visst värde, och sen räknar du bara upp den varje lopp i while.

har även testat så. Jag flyttade när fscanf() under och hade ett annat villkor för while().

Permalänk
Medlem
Skrivet av Leffe_B:

Var har du definierat count då?

precis ovanför while-loopen, under int itemNmr, inv;

Permalänk
Medlem

Det fungerar utmärkt om jag har 49 items i filen som ska läsas in från. Men när jag har över 50 så fungerar det ej alls.

Permalänk
Medlem

Fundera på vad pN gör, kan du använda den? Se om du kan sätta upp ett villkor där.

Permalänk
Medlem

nu börjar det hända något, den läser in tills arrayn är full, men om jag nu istället har 50 items och array storleken är 100 så kopierar den sista indexet och fyller ut med den tills det finns 100

Permalänk
Medlem

det är nog detta som gör att den fyller ut, while(count < MAX)

Permalänk
Hedersmedlem
Skrivet av lal27:

det är nog detta som gör att den fyller ut, while(count < MAX)

Du behöver som sagt ingen ny loop
Det du behöver är att avbryta denna loop:

while(fscanf(fp,"%d %s %d", &itemNmr, &name, &inv)==3){ a[*pN]=createCarIt(itemNmr,name,inv); (*pN)++; }

... när du läst in rätt antal.
Det lättaste att både skriva och sedan förstå är väl som sagt att sätta count=0 i början och sedan öka den varje loop. Men sedan måste du (inuti den där loopen, och innan du skriver till arrayen) kolla count och avbryta om du läst rätt antal.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
NAS: 6700K/16GB/Debian+ZFS | Backup (offsite): 9600K/16GB/Debian+ZFS

Permalänk
Medlem
Skrivet av Thomas:

Du behöver som sagt ingen ny loop
Det du behöver är att avbryta denna loop:

while(fscanf(fp,"%d %s %d", &itemNmr, &name, &inv)==3){ a[*pN]=createCarIt(itemNmr,name,inv); (*pN)++; }

... när du läst in rätt antal.
Det lättaste att både skriva och sedan förstå är väl som sagt att sätta count=0 i början och sedan öka den varje loop. Men sedan måste du (inuti den där loopen, och innan du skriver till arrayen) kolla count och avbryta om du läst rätt antal.

såklart, hade glömt break; nu fungerar den och kommer att fortsätta göra det hoppas jag

Permalänk
Medlem

@lal27: Ett problem nu är att du har pN som räknar hur många element arrayen innehåller och count som räknar hur många element du lagt till. Om du anropar funktionen med en array som inte är tom (pN > 0) så kommer funktionen ändå skriva MAX värden till den och skriva utanför arrayen.

Om det inte är meningen att användaren ska kunna välja var i arrayen funktionen ska börja skriva så bör du inte låta användaren bestämma start-värdet på pN. Men oavsett så är det onödigt att ha två räknare.