Πρόβλημα στο διάβασμα αρχείου και εκτύπωση αποτελεσμάτων  Το θέμα επιλύθηκε

...ασύγχρονα μαθήματα γλώσσας C

Πρόβλημα στο διάβασμα αρχείου και εκτύπωση αποτελεσμάτων

Δημοσίευσηαπό linuxs » 15 Σεπ 2011, 04:01

Καλησπέρα, κάνω μια άσκηση και έχω καοιο error δεν μπορώ να βάλω τα στοιχεία όπως θέλω. Ο κώδικας είναι:
Κώδικας: Επιλογή όλων

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

int main()
{
FILE *infile;
char city[32]; // ...gia tin poly
char date[16]; // ...gia tin imerominia
int temp; // ...gia tin thermokrasia
int humi; // ...gia tin ygrasia
char wind[4]; // ...gia ton anemo
int j=0, i=0;;
int D[21][2];
infile = fopen("myfile.txt","r");
if(infile==NULL) {
printf("Error code 1: File does not exist!\n");
exit(1);
}
while(fscanf(infile,"%s %s %d %d %s", city, date, &temp, &humi, wind) != EOF ) { char *pch;
j=0;
pch = strtok(date,"/");
while(pch != NULL) {
printf("--- > %s\n", pch);

if(j==0){
D[i][0] = atoi(pch);
}else if(j==1){
D[i][1] = atoi(pch);
}else if(j==2){
printf("### pch: %s and atoi-pch: %d \n", pch, atoi(pch));
D[i][2] = atoi(pch);
}



pch = strtok(NULL, "/");
j++;
}

/*
printf("city: %s\n", city);
printf("date: %s\n", date);
printf("temp: %d\n", temp);
printf("humi: %d\n", humi);
printf("wind: %s\n\n", wind);
*/
i++;
}

for(i=0; i<21; i++){
printf("\n");
for(j=0; j<3; j++){
printf("%d-%d: %d |\t", i, j, D[i][j]);
}
}
printf("teleiwwse kanonika!!! \n");
return 0;
}


αν προσέξετε στην εκτύπωση στις ### θα δείτε οτι όλα είναι 2001 αρα στην τρίτη στήλη αυτά θα μπαίνουν αλλα δεν μπαίνουν. Σίγουρα θα είναι κάποια χαζομάρα αλλα μήπως μπορείτε να βρείτε που είναι το λάθος?
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Πρόβλημα στην εισαγωγή στοιχείων σε πίνακα

Δημοσίευσηαπό migf1 » 06 Οκτ 2011, 16:52

Δώσε ένα sample myfile.txt
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Πρόβλημα στην εισαγωγή στοιχείων σε πίνακα

Δημοσίευσηαπό migf1 » 06 Οκτ 2011, 17:05

Πάντως με αυτό εδώ το myfile.txt...

Κώδικας: Επιλογή όλων

athens 12/1/2011 26 46 n
patras 12/1/2011 28 56 s
salonica 12/1/2011 24 35 n
heraklion 12/1/2011 30 60 n


μου βγάζει αυτό το αποτέλεσμα (που δείχνει να είναι ΟΚ)...

Κώδικας: Επιλογή όλων

--- > 12
--- > 1
--- > 2011
### pch: 2011 and atoi-pch: 2011
--- > 12
--- > 1
--- > 2011
### pch: 2011 and atoi-pch: 2011
--- > 12
--- > 1
--- > 2011
### pch: 2011 and atoi-pch: 2011
--- > 12
--- > 1
--- > 2011
### pch: 2011 and atoi-pch: 2011

0-0: 12 | 0-1: 1 | 0-2: 12 |
1-0: 12 | 1-1: 1 | 1-2: 12 |
2-0: 12 | 2-1: 1 | 2-2: 12 |
3-0: 12 | 3-1: 1 | 3-2: 2011 |
4-0: 2011 | 4-1: 0 | 4-2: 0 |
5-0: 0 | 5-1: 3296720 | 5-2: 0 |
6-0: 0 | 6-1: 3299739 | 6-2: 0 |
7-0: 0 | 7-1: 0 | 7-2: 0 |
8-0: 0 | 8-1: 0 | 8-2: 0 |
9-0: 0 | 9-1: 1073751289 | 9-2: 1 |
10-0: 1 | 10-1: 3 | 10-2: 0 |
11-0: 0 | 11-1: 2958 | 11-2: 0 |
12-0: 0 | 12-1: 0 | 12-2: 0 |
13-0: 0 | 13-1: 3281696 | 13-2: 0 |
14-0: 0 | 14-1: 3299739 | 14-2: 0 |
15-0: 0 | 15-1: 3299739 | 15-2: 0 |
16-0: 0 | 16-1: 0 | 16-2: 0 |
17-0: 0 | 17-1: -51086256 | 17-2: 2046 |
18-0: 2046 | 18-1: 3296720 | 18-2: 0 |
19-0: 0 | 19-1: 3296720 | 19-2: 0 |
20-0: 0 | 20-1: 6040 | 20-2: 1634887016 | teleiwwse kanonika!!!


Απλώς αραίωσα τον κώδικά σου για να μπορέσω να τον διαβάσω, δεν του άλλαξα κάτι (btw, γιατί ρε παιδιά γράφετε τόσο συμπυκνωμένο τον κώδικα; )

Κώδικας: Επιλογή όλων

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

// -----------------------------------------------------------------------------------
int main( void )
{
FILE *infile;
char city[32]; // ...gia tin poly
char date[16]; // ...gia tin imerominia
int temp; // ...gia tin thermokrasia
int humi; // ...gia tin ygrasia
char wind[4]; // ...gia ton anemo
int j=0, i=0;
int D[21][2];

infile = fopen("myfile.txt", "r");
if ( infile == NULL )
{
printf("Error code 1: File does not exist!\n");
exit( 1 );
}

while ( fscanf(infile, "%s %s %d %d %s", city, date, &temp, &humi, wind) != EOF )
{
char *pch;
j = 0;
pch = strtok( date, "/" );
while ( pch != NULL )
{
printf("--- > %s\n", pch);

if (j == 0) {
D[i][0] = atoi( pch );
}
else if (j == 1) {
D[i][1] = atoi( pch );
}
else if (j == 2) {
printf("### pch: %s and atoi-pch: %d \n", pch, atoi( pch ) );
D[i][2] = atoi( pch );
}

pch = strtok( NULL, "/" );
j++;
}

/*
printf("city: %s\n", city);
printf("date: %s\n", date);
printf("temp: %d\n", temp);
printf("humi: %d\n", humi);
printf("wind: %s\n\n", wind);
*/

i++;
}

for (i=0; i < 21; i++)
{
printf("\n");
for (j=0; j < 3; j++)
printf("%d-%d: %d |\t", i, j, D[i][j]);
}

printf("teleiwwse kanonika!!! \n");

return 0;
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Πρόβλημα στην εισαγωγή στοιχείων σε πίνακα

Δημοσίευσηαπό migf1 » 06 Οκτ 2011, 17:18

Btw, εκείνο το int D[21][2] τι είναι; Γενικώς τι προσπαθείς να κάνεις με αυτόν το 2-διάστατο πίνακα, γιατί δεν νομίζω πως τον χειρίζεσαι σωστά.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Πρόβλημα στην εισαγωγή στοιχείων σε πίνακα  Το θέμα επιλύθηκε

Δημοσίευσηαπό migf1 » 06 Οκτ 2011, 21:31

Δεν ξέρω αν σε βοηθάει καθόλου, αλλά σου έγραψα ένα δομημένο κώδικα που διαβάζει ένα αρχείο σαν αυτό που θέλεις, το βάζει στη μνήμη σε έναν πίνακα table, τον οποίο και τυπώνει στο τέλος. Θέλει compiler που να υποστηρίζει C99 standard ( -std=c99 στον gcc ).

Κώδικας: Επιλογή όλων

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

#define MAXINBUF 256+1

#define MAX_RECORDS 100

#define MAXSLEN_CITY (31+1) // max string length of a city
#define MAXSLEN_DATE (15+1) // max string length of a date
#define MAXSLEN_WIND (3+1) // max string length of wind

#define MAX_DATETOKENS 3 // max tokens in a date string
#define MASXLEN_DATETOKEN (6+1) // max string length of a date token

#define private

#define pressENTER() \
do { \
printf("\npress ENTER..."); \
while ( getchar() != '\n' ) \
; \
} while (0)

typedef enum Bool { FALSE=0, TRUE } Bool;

typedef struct Date { // Date Structure
char datestr[ MAXSLEN_DATE ]; // ... date as string
private int day, month, year; // ... privately converted to ints
} Date;

typedef struct Record { // Record Structure
int key;
char citystr[ MAXSLEN_CITY ]; // ... string for the city
Date date; // ... Date structure for the date
int temper; // ... int for the temperature
int humid; // ... int for the humidity
char windstr[ MAXSLEN_WIND ]; // ... string for the wind
} Record;

/* -------------------------------------------------------------------------------------
* int s_tokenize(char *s, char *tokens[], int maxtokens, char *delimiters)
*
* Split c-string s to up to maxtokens, using chars in delimiters as separators and
* saving each token into the array tokens[].
*
* Return number of split tokens or 0 on error.
* -------------------------------------------------------------------------------------
*/
int s_tokenize(char *s, char *tokens[], const int maxtokens, const char *delimiters)
{
register int i=0;

if ( !s || !tokens || !delimiters )
return 0;

tokens[0] = strtok(s, delimiters);
if (tokens[0] == NULL)
return 0;

for (i=1; i < maxtokens && (tokens[i]=strtok(NULL, delimiters)) != NULL; i++)
;

return i;
}

// -----------------------------------------------------------------------------------
// Print the day, month and year integer fields of a date structure
// -----------------------------------------------------------------------------------
Bool date_printints( const Date *date )
{
if ( !date || date->day == 0 || date->month == 0 || date->year == 0 )
return FALSE;

printf("%d-%d-%d\n", date->day, date->month, date->year );

return TRUE;
}

// -----------------------------------------------------------------------------------
// Convert a c-string datestr into its corresponding day, month & year integer fields,
// inside a data structure
// -----------------------------------------------------------------------------------
Bool date_str2ints( Date *date, char *datestr )
{
register int i = 0;
char tempstr[ MAXSLEN_DATE ] = {'\0'};
char *strtokens[ MAX_DATETOKENS ];

if ( !date || !datestr)
return FALSE;

strncpy( tempstr, datestr, MAXSLEN_DATE-1 );

if ( s_tokenize( tempstr, strtokens, MAX_DATETOKENS, "/-" ) < MAX_DATETOKENS )
return FALSE;

for (i=0; i < MAX_DATETOKENS; i++)
{
date->day = atoi( strtokens[0] );
date->month = atoi( strtokens[1] );
date->year = atoi( strtokens[2] );
}

return TRUE;
}

// -----------------------------------------------------------------------------------
// Convert the day, month & year integer fields of a date structure into a c-string
// -----------------------------------------------------------------------------------
Bool date_ints2str( char *datestr, const size_t maxslen, const Date *date )
{
if ( !date || !datestr )
return FALSE;

snprintf( datestr, maxslen, "%d/%d/%d", date->day, date->month, date->year );

return TRUE;
}

// -----------------------------------------------------------------------------------
// print the fields of a rec structure
// -----------------------------------------------------------------------------------
Bool record_print( const Record *rec )
{
if ( !rec )
return FALSE;

if ( rec->key != 0 )
{
printf("city: %s\n", rec->citystr);
printf("date: %s\n", rec->date.datestr);
printf("temper: %d\n", rec->temper);
printf("humid: %d\n", rec->humid);
printf("wind: %s\n\n", rec->windstr);
}

return TRUE;
}

// -----------------------------------------------------------------------------------
// print up to maxrecords records of table
// -----------------------------------------------------------------------------------
Bool table_print( const Record table[], const int maxrecords )
{
register int i = 0;

if ( maxrecords > MAX_RECORDS )
return FALSE;

for (i=0; i < maxrecords; i++)
record_print( &table[i] );

return TRUE;
}
// -----------------------------------------------------------------------------------
int main( void )
{
char inbuf[ MAXINBUF ] = {'\0'};
FILE *infile = NULL;
Record table[ MAX_RECORDS ];
register int i = 0;

// open the file
infile = fopen("myfile.txt", "r");
if ( infile == NULL ) {
printf("Error code 1: File does not exist!\n");
pressENTER();
exit( 1 );
}

// zero all records in table
memset( table, 0, MAX_RECORDS * sizeof( Record ) );

// read up to MAX_RECORDS records from infile into table (one rec per line)
for ( i=0; i < MAX_RECORDS && fgets( inbuf, MAXINBUF, infile ); i++ )
{
sscanf( inbuf,
"%s %s %d %d %s",
table[i].citystr, table[i].date.datestr, &table[i].temper,
&table[i].humid, table[i].windstr
);

// convert date string to corresponding integer fields
if ( !date_str2ints( &table[i].date, table[i].date.datestr) )
{
puts("Error code 2: invalid date found in file!\n");
fclose( infile );
pressENTER();
exit( 2 );
}

// set the record's key
table[i].key = i+1;
}

table_print( table, MAX_RECORDS );

fclose( infile );

printf("teleiwse kanonika!!! \n");
pressENTER();

exit( 0 );
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Πρόβλημα στην εισαγωγή στοιχείων σε πίνακα

Δημοσίευσηαπό linuxs » 07 Οκτ 2011, 06:02

thx για τις απαντήσεις απλά στην τρίτη στήλη παίρνω 11 αντί για 2011. :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Πρόβλημα στην εισαγωγή στοιχείων σε πίνακα

Δημοσίευσηαπό migf1 » 07 Οκτ 2011, 07:07

linuxs έγραψε:thx για τις απαντήσεις απλά στην τρίτη στήλη παίρνω 11 αντί για 2011. :/

Ποια 3η στήλη, και τι κάνει τελικά το D[... ][...] ;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Πρόβλημα στην εισαγωγή στοιχείων σε πίνακα

Δημοσίευσηαπό linuxs » 22 Φεβ 2012, 07:42

migf1 έγραψε:Ποια 3η στήλη, και τι κάνει τελικά το D[... ][...] ;


@migf1 η αλήθεια είναι οτι δεν ήταν πλήρως δικός μου κώδικας και προσπαθούσα να καταλάβω την λογική και να τον κάνω να δουλέψει. Βέβαια, πολλές φορές καλύτερα να τα γράφεις απο την αρχή. Τελοςπάντων δεν μπορώ να θυμηθώ τι ακριβώς έκανα τότε οπότε ξέχνα το. Και σρυ που κάπως ξεχάστηκε το θέμα και δεν είχα απαντήσει(δεν μπορώ να θυμηθώ γιατί). :/ Θεωρώ οτι ο προτεινόμενος κώδικας σου είναι σωστός πάνω στο πρόβλημα και μάλλον κάτι τέτοιο ήθελα... :)
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Μαθήματα C