Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C] Textfile naar 2D-array

Pagina: 1
Acties:
  • 78 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik wil een text file inlezen en deze naar een 2d array schrijven. Dit doe ik met de volgende code:

[code=C]#include <stdio.h>
#include <math.h>
#define KOLOM 6
#define RIJ 12

int main (void)
{

FILE *invoer;
int a=0, b=0;
int tabel[a][b];
invoer = fopen("test.txt", "r");


if(invoer != NULL)
{
printf("Bestand %s geopend\n", invoer);
for (a=0;a<RIJ;a++){
for (b=0;b<KOLOM;b++){
fscanf(invoer, "%d", &tabel[a][b]);
printf("%d\t", tabel[a][b]);
}
}

}
else{
printf("Bestand %s niet gevonden\n", invoer);
}

fclose(invoer);
return 0;
}


[/code=C]

De output is 10 kolommen en 8 rijen terwijl RIJ en KOLOM anders staan ingesteld. Ziet iemand wat ik hier fout doe?

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Klopt regel 11?
Je declareert een array van 0 elementen.

[ Voor 120% gewijzigd door Icelus op 07-01-2008 16:42 ]

Developer Accused Of Unreadable Code Refuses To Comment


Verwijderd

Topicstarter
Dit is dan toch een variabele waarde die je later bij die for lussen krijgt?

Voorbeeld van de input file die was ik vergeten erbij te zetten:

1 1 12 1 1 1
2 2 11 1 1 1
3 3 10 1 1 1
4 4 9 1 1 1
5 5 8 1 1 1
6 6 7 1 1 1
7 7 6 1 1 1
8 8 5 1 1 1
9 9 4 1 1 1
10 10 3 1 1 1
11 11 2 1 1 2
12 12 1 1 1 2

[ Voor 61% gewijzigd door Verwijderd op 07-01-2008 16:43 ]


  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 21-10 21:48
Ik gebruik een soort gelijk iets, in VB.net maar dat zal niet veel verschillen.

Txt file inlezen,
Splitten op de CRLF
Aantal rows opslaan
Vervolgens elke row afgaan, en deze splitten op je split teken. Aantal elementen opslaan als deze waarde groter is dan de vorige row.

Nu heb je je aantal rows en kolommen, en kan je de return array definieren.

Vervolgens loop je daaor alle rows heen, met een embedden loop voor elke row te splitten.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Public Function File2Array(ByVal input As String, ByVal Separator As String)
        ' Creation 23-10-2007, By Fleppuhstein
        ' Status: Ready for usage.
        ' A function for converting a text file to an array. Can convert a text file
        ' based on the given separator. Always returns a 2D array, each fileline will
        ' corespondend with the first element.

        ' Declarations.
        Dim ReturnValue(,) As String
        Dim FileContents As String = ""
        Dim FileLines() As String
        Dim FileLine As String
        Dim MaxParts As Integer
        Dim LineParts() As String

        ' First check if the file can be found.
        If (My.Computer.FileSystem.FileExists(input)) Then
            FileContents = My.Computer.FileSystem.ReadAllText(input)

            ' Split on the Cariage Return, Line Feed.
            FileLines = Split(FileContents, vbCrLf)

            ' First search the fileline with the most parts
            For Each FileLine In FileLines
                LineParts = Split(FileLine, Separator)

                ' Only if the current length is larger than the previous saved lenght
                ' Save the lenght in Maxparts.
                If LineParts.Length > MaxParts Then
                    MaxParts = LineParts.Length
                End If
            Next

            ' Resize the array, to fit all elements.
            ReDim ReturnValue(FileLines.Length, MaxParts)

            ' Let's start and fill the array
            For x As Integer = 0 To FileLines.Length - 1

                LineParts = Split(FileLines(x), Separator)

                For y As Integer = 0 To LineParts.Length - 1
                    ReturnValue(x, y) = LineParts(y)
                Next

            Next
        Else
            Return "Input file could not be found."
        End If

        Return ReturnValue
    End Function

[ Voor 67% gewijzigd door fleppuhstein op 07-01-2008 16:47 ]


  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03 15:04
Is al een tijdje geleden dat ik met C bezig ben geweest en nooit op heel erg hoog niveau (dus zou het totaal fout kunnen hebben) maar je zult inderdaad eerst 2D array moeten declareren. Anders weet C naar mijn weten niet hoeveel memory ervoor gereserveerd dient te worden.

Verwijderd

Topicstarter
Ik heb hem gedeclareerd maar de output blijft hetzelfde als dat ik hem declareer als tabel[a][b]

  • maxjuh
  • Registratie: November 2004
  • Laatst online: 19-03 15:04
Sorry bedoelde hier natuurlijk intialiseren...

  • Jewest
  • Registratie: Juni 2007
  • Laatst online: 19-11 14:32
int tabel[a][b]; is verkeerd, gebruik je rij en colomn consts hiervoor.

je hebt geen crash in je programma?

volgens mij, gaat het ook mis met je \n in je text file.
je krijgt de hele tijd 1 als laatste elementen.?

Flickr
Canon 7D + Glas + Licht
Komt het rot over dan bedoel ik het anders en taalfouten zijn inbegrepen.


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
De fout zit hem in de uitvoer die je doet. Je moet na het uitvoeren van de binnenste for-lus een \n naar je scherm schrijven. Nu autowrapt hij gewoon op 80 tekens o.i.d.
edit:

Moehahaha ik was lekker eerst :D

[ Voor 13% gewijzigd door bigbeng op 07-01-2008 17:13 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op maandag 07 januari 2008 @ 16:36:
De output is 10 kolommen en 8 rijen terwijl RIJ en KOLOM anders staan ingesteld. Ziet iemand wat ik hier fout doe?
Afgezien van de foute definitie (dus niet declaratie of initialisatie ;)) van tabel, output je alle waarden afgescheden door tabs. Je begint geen nieuwe regel als je met een nieuwe rij begint.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Nee ik heb geen crash in mijn programma.
Ik zie gewoon de goede waardes maar met een verkeerde indeling.
Met de \n bedoel je zeker de \t? deze moet er wel in zitten want bij de input file staan er tabs tussen de getallen die hier weg zijn gevallen.
De output ziet er als volgt uit:

1 1 12 1 1 1 2 2 11 1
1 1 3 3 10 1 1 1 4 4
9 1 1 1 5 5 8 1 1 1
6 6 7 1 1 1 7 7 6 1
1 1 8 8 5 1 1 1 9 9
4 1 1 1 10 10 3 1 1 1
11 11 2 1 1 2 12 12 1 1
1 2

  • Reinstein
  • Registratie: Juni 2003
  • Laatst online: 08-07-2021

Reinstein

Half-Nul

In C moet je van te voren opgeven hoe groot je je 2D array wilt hebben. Simpelweg [a][b] werkt niet. In C moet je dat soort dingen zelf doen, dat is nl. het voor en nadeel van C.

Wat je het beste kunt doen is dynamische geheugen aanmaken. Alleen dan moet je alles zelf bij houden. Wil je het perse in C op lossen of mag het ook in een andere taal? Ben je trouwens bekend met pointers?

Dynamische geheugen aanvragen kun je doen met malloc(), en dat MOET je vrijgeven met free()

[toegevoegd]
Trouwens, heeft de file die je inleest altijd het zelfde aantal rijen en kolommen?

[ Voor 8% gewijzigd door Reinstein op 07-01-2008 17:14 ]

PC based oscilloscope


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Reinstein schreef op maandag 07 januari 2008 @ 17:11:
In C moet je van te voren opgeven hoe groot je je 2D array wilt hebben. Simpelweg [a][b] werkt niet. In C moet je dat soort dingen zelf doen, dat is nl. het voor en nadeel van C.
Onzin, in C99 is het gewoon toegestaan om (lokale) arrays te definieren met variabele dimensies.
Wat je het beste kunt doen is dynamische geheugen aanmaken.
Dat is helemaal niet het beste, want zijn dimensies zijn gewoon constant (alleen gebruikt hij het momenteel niet zo), namelijk KOLOM x RIJ.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Reinstein
  • Registratie: Juni 2003
  • Laatst online: 08-07-2021

Reinstein

Half-Nul

.oisyn schreef op maandag 07 januari 2008 @ 17:13:
Onzin, in C99 is het gewoon toegestaan om (lokale) arrays te definieren met variabele dimensies.
Ok, dat wist ik niet, weer wat geleerd :)

PC based oscilloscope


Verwijderd

Topicstarter
.oisyn schreef op maandag 07 januari 2008 @ 17:11:
[...]

Afgezien van de foute definitie (dus niet declaratie of initializatie ;)) van tabel, output je alle waarden afgescheden door tabs. Je begint geen nieuwe regel als je met een nieuwe rij begint.
Dit was de oplossing! De indeling klopt nu wel, ik mis alleen van de laatste regel de laatste 4 getallen. Op de eerste plaats staat een ander getal en de rest mist gewoon.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Verwijderd schreef op maandag 07 januari 2008 @ 17:11:
...
Met de \n bedoel je zeker de \t? deze moet er wel in zitten want bij de input file staan er tabs tussen de getallen die hier weg zijn gevallen.
...
Ik neem aan dat dit een reactie is op mij? Nee, ik bedoel echt een \n en ik zeg in feite hetzelfde als .oisyn direct onder mijn post. Je wrapt niet automatisch als je aan een nieuwe regel in je input bestand begint. Dus tussen regel 22 en 23 even een printf("\n"); toevoegen.
edit:
Crap! Nu ben ik te laat ;)

[ Voor 3% gewijzigd door bigbeng op 07-01-2008 17:19 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:10
Even een opmerking aan de Topicstarter: heb je zelf al eens gedebugged, en geprobeerd uit te zoeken wat er misloopt en waar het misloopt ?

Zoals het topic er nu staat, is het gewoon een 'debug-en-fix-m'n-code-ff' topic, en dergelijke topics zien we hier niet graag...

Misschien kan je eens even de PRG Quickstart lezen, en in 't vervolg een topic openen adhv deze quickstart.

Hmm, ik merk echter dat je al een paar keer op die Quickstart gewezen bent, en dan wel voor dezelfde reden. Op die manier gaat het natuurlijk niet helpen dus ...

[ Voor 17% gewijzigd door whoami op 07-01-2008 17:24 ]

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.