Δημοσιεύτηκε: 05 Φεβ 2012, 16:24
stamatiou έγραψε:
...
Έχω φτάσει μέχρι εδώ: http://ideone.com/rmVSx
αλλά έχω τα παρακάτω σφάλματα στο compiling:
- Κώδικας: Επιλογή όλων
read_per_line.c:4:34: error: array type has incomplete element type
read_per_line.c:18:29: error: array type has incomplete element type
read_per_line.c: In function ‘main’:
read_per_line.c:37:2: error: type of formal parameter 2 is incomplete
read_per_line.c:38:2: error: type of formal parameter 1 is incomplete
Τι σημαίνουν αυτά;
Καλησπέρα,
σημαίνουν ότι το dbuf δεν μπορείς να το περνάς σε συναρτήσεις χωρίς να δηλώνεις το μέγεθος των διαστάσεών του (20χ20 στην περίπτωσή σου). Για να μπορείς να το περνάς χωρίς αναφορά στις διαστάσεις του, θα πρέπει να το έχεις ορίσει ως δυναμικό πίνακα: char **dbuf και να το έχεις κάνεις malloc/calloc στις διαστάσεις που χρειάζεσαι, κι απο εκεί και πέρα θα μπορείς να το περνάς σε όποια συνάρτηση θέλεις χωρίς διαστάσεις, ως: char **dbuf.
Πέρα όμως από αυτό, ο κώδικάq σου έχεις διάφορα άλλα προβλήματα. Π.χ. δεν τερματίζεις τα επιμέρους strings του dbuf με '\'0' στην read_line(), ενώ αναζητάς το '\0' ως σηματοδότη τέλους όταν πας να τα τυπώσεις στην print_double_array(). Επίσης δεν ελέγχεις πουθενά να μην δημιουργηθούν πάνω από 20 strings μέσα στον dbuf στην read_line(). Και διάφορα άλλα... π.χ. το \n μέσα σε ένα αρχείο είναι 2 χαρακτήρες: ο '\' και ο 'n' και όχι ένας αλλαγής γραμμής... ο χαρακτήρας αλλαγής γραμμής μέσα στο αρχείο μπαίνει όπου αλλάζει γραμμή στα περιεχόμενα του αρχείου. Ακόμα, το αρχείο αντί για ανάγνωση το ανοίγεις για εγγραφή, επίσης δεν κάνεις πουθενά fclose() τον δείκτη που έχεις κάνει fopen()
Σου παραθέτω κώδικα που κάνει αυτό που προσπαθείς να κάνεις, με στατικούς ορισμούς και των 2 πινάκων, αλλά με αλλαγμένα ονόματα (τα θεωρώ πιο κατανοητά) και με διαχωριστή (separator) τον χαρακτήρα ';'
- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSTRLEN (100+1)
#define NSTRINGS 20
#define SEPARATOR ';'
/* ------------------------------------------------------ */
int print_arrstr( char arrstr[NSTRINGS][MAXSTRLEN] )
{
int i;
for (i = 0; i < NSTRINGS && arrstr[i][0] != '\0'; i++)
printf( "%d: %s\n", i, arrstr[i] );
return 0;
}
/* ------------------------------------------------------ */
int tokenize_str( char str[], char arrstr[NSTRINGS][MAXSTRLEN] )
{
int bi=0, i=0, j=0;
for (bi=0;
i < NSTRINGS && bi < MAXSTRLEN && str[bi] != '\0' && str[bi] != '\n';
bi++)
{
if (str[bi] != SEPARATOR && j < MAXSTRLEN ) {
arrstr[i][j++] = str[bi];
}
else {
arrstr[i][j] = '\0';
i++;
j = 0;
}
}
arrstr[i][j] = '\0';
return 0;
}
/* ------------------------------------------------------ */
int main( void )
{
char str[ MAXSTRLEN ] = {'\0'}; /* c-string */
char arrstr[ NSTRINGS ][ MAXSTRLEN ] = { {'\0'} }; /* array of c-strings */
FILE *fp = fopen("test4.dat", "r");
if ( !fp ) {
fputs("*** fatal error: Could not open file!\n", stderr);
exit( EXIT_FAILURE );
}
fgets( str, MAXSTRLEN, fp);
puts( str );
tokenize_str( str, arrstr );
print_arrstr( arrstr );
fclose( fp );
exit( EXIT_SUCCESS );
}
Οπότε, με είσοδο αρχείο που περιέχει π.χ. αυτό:
- Κώδικας: Επιλογή όλων
1234;a;bcdefgh;56;7;ijk
παίρνεις ως έξοδο, αυτό:
- Κώδικας: Επιλογή όλων
1234;a;bcdefgh;56;7;ijk
0: 1234
1: a
2: bcdefgh
3: 56
4: 7
5: ijk
Πάντως υπάρχει έτοιμη συνάρτηση που κάνει string tokenizations, η strtok()