Προς το περιεχόμενο

κάπως περίεργο fscanf


jimbakl

Προτεινόμενες αναρτήσεις

Δημοσ.

καλησπέρα.. είμαι καινούργιος στον προγραμματισμό αλλά πρέπει να φτιάξω αυτό το πρόγραμμα που να διαβάζει αυτο το txt. και στην συνέχεια να κάνω κάτι πράξεις με αυτά τα δεδομένα...

έχω κάνει αυτό αλλά είναι επιεικώς απαράδεκτο... όσα fscanf έχω βρει στο ιντερνετ ή σε βιβλία ξέρουν από την αρχή πόσα δεδομένα θα διαβάσουν και κάνουν πχ "%f %f %f %f %f" αν είναι πχ 5 φλοατ.. στην περίπτωσή μου όμως δεν ξέρω πόσα είναι

>if(infile==NULL);
{printf("Cannot open this file\n");
 exit(1);
}
fscanf(infile,"%d\n",&n);
	i=0;
	for(j=0;j<n;j++)
	{
	fscanf(infile,"%f",&profit[j]);
	}
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
		fscanf(infile,"%f",&dis[i][j]);
		}

 

 

to αρχείο ειναι έτσι

>
6				
0 200 80 140 100 75  		
0 26.9 50.2 49.3 46.3 12		
26.9 0 72.4 74.7 68.7 70.4
50.2 72.4 0 54.7 4 75
49.3 74.7 54.7 0 52.2 25.2
46.3 68.7 4 52.2 0 71.7
12 70.4 75 25.2 71.7 0

  • Απαντ. 32
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

αυτό πού άρχισα να κάνω τώρα, αλλά μου φαίνεται λίγο παράδοξο είναι αυτό...

 

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

main()
{
   int i,N,j;
   float data[400]; // pinakas poy bazo ta dedomena
float profit[N];
FILE*infile;
infile=fopen("φιλεναμε.txt","r");
if(infile==NULL)
{
printf("Cannot open the file\n");
exit(1);
}
i=0;
while(fscanf(infile,"%f",&data[i])!=EOF)
{
	printf("%.2f\t",data[i]);
       i++;	
   }
       printf("\ni=%d",i); 
   	fclose(infile);
   	
  	// MORFOPOIISI TOY data[] kai DIMIOURGIA TWN PRAGMATIKWN PINAKWN dis, profit
   
   N=data[0]; // N einai o # twn pelatwn 
   printf("\nN=%.1f\n",data[0]);	
   printf("\n\nprofit=\n");                                                                                                                                                          
  	for(i=1;i<N+1;i++)                                                                                                                                                                  
  	{
   profit[i-1]=data[i];        //synexizw apo to data[1] mexri  to data[N] kai                                                                                                                                                           
   printf("%.1f\t",profit[i-1]);// bazo times ston pinaka profit arxizontas apo 
   }                            // to profit[0]
   printf("\n");
   
   
system("pause");
}

 

απλά έχω κολλήσει στο πως θα βάλω τα στοιχεία της 3ης γραμμής του πίνακα και μετά σε έναν νέο πίνακα...

 

Υπάρχει και πιο εύκολος τρόπος από αυτό;;;; ή κάνω χαζομάρες;;

Δημοσ.

Να υποθέσω ότι το 6 που έχει το αρχείο πάνω πάνω λέει ότι θα ακολουθήσουν 6x6 αριθμοί;

ναι.. θα ακολουθήσει ένας πίνακας 1χ6 και μετά ένας 6χ6 όπως φαίνεται και στο txt

Δημοσ.

Εφόσον το αρχείο περιέχει σαν πληροφορία το μέγεθος του πινακα που ακολουθεί, μπορείς να διαβάσεις αυτή τη τιμή και μετά να φτιάξεις δυναμικά τον πίνακα με malloc αυτών των διαστάσεων. Άρα δεν χρειάζεται λοιπόν να ορίζεις έναν τεράστιο πίνακα και να χρησιμοποιείς ένα μέρος αυτού.

 

Βρήκα ένα παράδειγμα κώδικα που είχα που κάνει αυτή τη δουλειά, δλδ διαβάζει δεδομένα από ένα αρχείο και γεμίζει ένα δισδιάστατο πίνακα,.

 

Νομίζω θα καταλάβεις τι παίζει για να το φέρεις στα μέτρα της άσκησης σου. Για ότι χρειαστείς ρωτάς...

 

>
#include <stdio.h>

int main(void)
{
int i, j;
float **myarray;
int myarraysize = 0;

FILE *fp = fopen("input.txt", "r");
fscanf(fp, "%d", &myarraysize);

myarray = (float **)malloc(myarraysize * sizeof(float));

for(i=0; i<myarraysize; i++) //
{
	myarray[i] = (float *)malloc(myarraysize * sizeof(float));
	for(j=0; j<myarraysize; j++) //
	{
		fscanf(fp, "%f", &myarray[i][j]);
	}
}

fclose(fp);
return;
}

Δημοσ.

@tasos_: έχεις ξεχάσει να απελευθερώσεις με free() τη μνήμη που έχεις δεσμεύσει δυναμικά, πριν τερματίσεις το πρόγραμμά σου. Παρόλο που στο C99 standard η μνήμη αυτή απελευθερώνεται αυτόματα, τα C99 standards δεν υποστηρίζονται όλα από όλους τους compilers, οπότε δεν μπορούμε να το αφήσουμε στην τύχη το συγκεκριμένο, γιατί οδηγεί σε memory leaks.

Δημοσ.

Εφόσον το αρχείο περιέχει σαν πληροφορία το μέγεθος του πινακα που ακολουθεί, μπορείς να διαβάσεις αυτή τη τιμή και μετά να φτιάξεις δυναμικά τον πίνακα με malloc αυτών των διαστάσεων. Άρα δεν χρειάζεται λοιπόν να ορίζεις έναν τεράστιο πίνακα και να χρησιμοποιείς ένα μέρος αυτού.

 

Βρήκα ένα παράδειγμα κώδικα που είχα που κάνει αυτή τη δουλειά, δλδ διαβάζει δεδομένα από ένα αρχείο και γεμίζει ένα δισδιάστατο πίνακα,.

 

Νομίζω θα καταλάβεις τι παίζει για να το φέρεις στα μέτρα της άσκησης σου. Για ότι χρειαστείς ρωτάς...

 

>
#include <stdio.h>

int main(void)
{
int i, j;
float **myarray;
int myarraysize = 0;

FILE *fp = fopen("input.txt", "r");
fscanf(fp, "%d", &myarraysize);

myarray = (float **)malloc(myarraysize * sizeof(float));

for(i=0; i<myarraysize; i++) //
{
	myarray[i] = (float *)malloc(myarraysize * sizeof(float));
	for(j=0; j<myarraysize; j++) //
	{
		fscanf(fp, "%f", &myarray[i][j]);
	}
}

fclose(fp);
return;
}

 

 

kaλημέρα σας... Από ότι είχα καταλάβει από τον compiler μου, έβγαζε σφάλμα γιατί δεν μπορούσε να μετατρέψει το int se float, και κατι έβγαζε με float[*][]....

 

άλλη μια φορά που τα συναντάω μπροστά μου τις δομές.. έχω ψάξει αρκετά, αλλά δεν μπορώ να βρώ κάτι για να καταλάβω τι παίζει με αυτά τα πράγματα, μήπως ξέρει κανείς τίποτα για να βοηθήσει;;;;

Δημοσ.

kaλημέρα σας... Από ότι είχα καταλάβει από τον compiler μου, έβγαζε σφάλμα γιατί δεν μπορούσε να μετατρέψει το int se float, και κατι έβγαζε με float[*][]....

 

άλλη μια φορά που τα συναντάω μπροστά μου τις δομές.. έχω ψάξει αρκετά, αλλά δεν μπορώ να βρώ κάτι για να καταλάβω τι παίζει με αυτά τα πράγματα, μήπως ξέρει κανείς τίποτα για να βοηθήσει;;;;

Θα βοηθούσε αν μας έγραφες την εκφώνηση της άσκησης που προσπαθείς να επιλύσεις με αυτόν τον κώδικα. Επίσης, ποια ακριβώς πράγματα εννοείς σε αυτή σου τη φράση: "αλλά δεν μπορώ να βρώ κάτι για να καταλάβω τι παίζει με αυτά τα πράγματα".

Δημοσ.

@tasos_: έχεις ξεχάσει να απελευθερώσεις με free() τη μνήμη που έχεις δεσμεύσει δυναμικά, πριν τερματίσεις το πρόγραμμά σου. Παρόλο που στο C99 standard η μνήμη αυτή απελευθερώνεται αυτόματα, τα C99 standards δεν υποστηρίζονται όλα από όλους τους compilers, οπότε δεν μπορούμε να το αφήσουμε στην τύχη το συγκεκριμένο, γιατί οδηγεί σε memory leaks.

 

Εφόσον τερματίζει το πρόγραμμα δεν απελευθερώνεται η μνήμη που δέσμευσε το πρόγραμμα αυτό;

Δημοσ.

Εφόσον τερματίζει το πρόγραμμα δεν απελευθερώνεται η μνήμη που δέσμευσε το πρόγραμμα αυτό;

 

Όχι απαραίτητα, εξαρτάται από την πλατφόρμα (και τον compiler). Στα δημοφιλή OS απελευθερώνεται.

Δημοσ.

Όχι απαραίτητα, εξαρτάται από την πλατφόρμα (και τον compiler). Στα δημοφιλή OS απελευθερώνεται.

 

Δηλαδή σε ποια OS δεν απελευθερώνεται η μνήμη; Μου φαίνεται πολύ μεγάλο bug για λειτουργικό κάτι τέτοιο...

Δημοσ.

Θα βοηθούσε αν μας έγραφες την εκφώνηση της άσκησης που προσπαθείς να επιλύσεις με αυτόν τον κώδικα. Επίσης, ποια ακριβώς πράγματα εννοείς σε αυτή σου τη φράση: "αλλά δεν μπορώ να βρώ κάτι για να καταλάβω τι παίζει με αυτά τα πράγματα".

η εκφώνηση δεν λέει κάτι, την έχω κάνει την άσκηση, είναι ένα πρόβλημα δρομολόγησης, απλά πρέπει να την κάνω τώρα να διαβάζει τα δεδομένα από ένα txt αρχείο και όχι να τα δηλώνω εγώ στην αρχή..

 

να υπενθυμίσω.. στο τχτ που παραθέτω τα δεδομένα παραπάνω, το πρώτο νούμερο στην περίπτωσή μου το 6 είναι ο αριθμός των πελατών.. η 1η επόμενη σειρά θα είναι ο πίνακας profit[6] και απο την αποκάτω σειρά μέχρι το τέλος θα ειναι ο πίνακας των αποστάσεων dis[6][6]..

εγώ θέλω να τα διαβάσω..

 

αυτα τα πράγματα είναι τα float **myarray; και όπου έχει * ή ** από ότι έχω βρεί είναι τα structs ???.. το θέμα είναι πως δεν μπορώ κάπου να διαβάσω για να καταλάβω τί παίζει με αυτά.. αυτό που έχω κάνει εγώ είναι το παρακάτω

 

 

 

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

main()
{
   int i,N,j,length;
   float data[400]; // pinakas poy bazo ta dedomena
float profit[N];
float dis[N][N];
FILE*infile;
infile=fopen("dataRouting.txt","r");
if(infile==NULL)
{
printf("Cannot open the file\n");
exit(1);
}
printf("data:\n");
i=0;
while(fscanf(infile,"%f",&data[i])!=EOF)
{
	printf("%.2f\t",data[i]);
       i++;	
   }
   length=i;
  	fclose(infile);
   	
  	// MORFOPOIISI TOY data[] kai DIMIOURGIA TWN PRAGMATIKWN PINAKWN dis, profit
   
   N=data[0]; // N einai o # twn pelatwn 
   printf("\n\nN=%.1d\n",N);	
   
   // dimiourgia pinaka profit[]
   printf("\n\nprofit=\t");                                                                                                                                                          
  	for(i=1;i<N+1;i++)                                                                                                                                                                  
  	{
   profit[i-1]=data[i];        //synexizw apo to data[1] mexri  to data[N] kai                                                                                                                                                           
   printf("%.1f\t",profit[i-1]);// bazo times ston pinaka profit arxizontas apo 
   }                            // to profit[0]
    printf("\n\n");
   // dimiourgia pinaka dis[][]
   for(i=N+1;i<length;i++)
   {
   printf("%.1f\t",data[i]);
   }
   printf("\n");

   for(i=N+1;i<length+1;i+=N)
   {
        for(j=N+1;j<length;j++)
        {
        dis[i][j]=data[i][j];
        printf("%.1f",dis[i][j]);
        }     
        printf("\n");
   }
   printf("\n");
  
system("pause");
}


και βγάζει αυτά τα λάθη
[code]29 [Warning] converting to `int' from `float' 
51  invalid types `float[int]' for array subscript 

Δημοσ.

Δηλαδή σε ποια OS δεν απελευθερώνεται η μνήμη; Μου φαίνεται πολύ μεγάλο bug για λειτουργικό κάτι τέτοιο...

 

Στις δημοφιλείς πλατφόρμες απελευθερώνεται, δεν είναι όμως σίγουρο ότι το ίδιο συμβαίνει π.χ. σε ένα ενσωματωμένο σύστημα.

 

Επίσης, στον κώδικα που έχεις παραθέσει, δεν ελέγχεις αν πετυχαίνουν ή όχι τα malloc() που κάνεις, κι αν δεν πετύχουν τότε το prog σου κρασάρει μετέπειτα.

 

@jimbaki: Τα * δεν είναι structs (δομές) είναι pointers (δείκτες) που μπορούν είτε να είναι NULL είτα να δείχνουν σε διευθύνσεις άλλων μεταβλητών του ίδιου τύπου (απλών ή struct). Επίσης στη C μπορεί να αναφέρονται σε πίνακες, οπότε σε αυτή την περίπτωση το ** αναφέρεται σε 2-διάστατο πίνακα.

 

Μπορείς να ρίξεις μια ματιά εδώ: http://www.gvrteam.g...?p=46913#p46913 όπου επιχειρώ να εξηγήσω με απλά λόγια τους δείκτες.

 

Σε ότι αφορά τον κώδικά σου, θα τον κοιτάξω σε λιγάκι και θα επανέλθω ;)

Δημοσ.

ευχαριστώ.. κοίταξέ το όποτε μπορείς και εγώ θα κοιτάξω να δώ τι είναι αυτό το malloc() που λες...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...