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

Προβλημα αναγνωσης αρχειου


MauriDalia

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

Δημοσ.

Γεια σας,

Στο παρακατω προγραμμα προσπαθω να διαβασω τα περιεχομενα του αρχειου jacobi.txt , να εκτυπωσω αυτα που διαβαζω στην οθονη μου και στην συνεχειαα να περασω αυτες τις τιμες που διαβασα σε εναν πινακα floats τον t.

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

#include <sys/time.h>

#include <sys/types.h>


#define NPROC 1  
#define NR 14   //grammes
#define NC 14    
#define NRL (NR/NPROC)     //NRL=14
#define NITER 1000


main(int argc,char **argv)
  {
float t[NRL+2][NC+2];
   char buf[32];
  
   FILE * hFile;
   
   hFile = fopen("jacobi.txt", "r");
   for(i=0;i<=NRL+1;i++)  {     //apo 0 ews 15....
   fgets(buf,sizeof(buf),hFile);
   printf("%s\n",buf);
    for(j=0;j<=NC+1;j++)
    {
    t[i][j]=buf[2*j];
       }
   
}
fclose( hFile);
}

 

Ομως μου πεταει segmentation fault:cry::cry:

Καμια ιδέα?Ευχαριστω

Δημοσ.

Με καποιες αλλαγες που εκαναα καταφερα να διαβαζω και να εκτυπωνω το περιεχομενο του αρχειου μου.Το επομενο που προσπαθω να καταφερω ειναι να καταχωρω τις τιμες αυτες σε εναν δισδιαστατο πινακα floats αλλα μαλλον θελει καποια συναρτηση μετατροπης.Δοκιμασα την atof αλλα δεν τα καταφερα :cry:

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

#include <sys/time.h>

#include <sys/types.h>


#define NPROC 1  
#define NR 14   
#define NC 14    
#define NRL (NR/NPROC)     
#define NITER 1000

int main(int argc, char *argv[])
{
 FILE *fp;
 char ch;
 float t[NRL+2][NC+2];
 
 fp = fopen("jacobi.txt","r");

 while((ch = fgetc( fp )) != EOF) {
   printf("%c", ch);
   
    for(i=0;i<=NRL+1;i++)  {
      for(j=0;j<=NC+1;j++)   
      {
          t[i][j]=atof(c);
 }
}
}
 fclose(fp);
for(i=0;i<=NRL+1;i++)  {
      for(j=0;j<=NC+1;j++)   
      {
         printf("%f",t[i][j]);
         printf("\n");
 }
}
 return 0;
}

 

Καμια βοηθεια?:-)

Δημοσ.

Καλησπέρα. Μερικές παρατηρήσεις:

 

1. Έχεις ένα σοβαρό λογικό λάθος: Σε κάθε επανάληψη της while, προσπαθείς να γεμίσεις όλες τις θέσεις του πίνακά σου με τη μοναδική τιμή που μόλις διαβάστηκε από την fgetc

2. Η fgetc διαβάζει αδιακρίτως όλους τους χαρακτήρες από το αρχείο. Και τα κενά μεταξύ των στοιχείων του πίνακα, και το χαρακτήρα αλλαγής γραμμής στο τέλος κάθε γραμμής. Δεν το έχεις προβλέψει στον κώδικά σου

3. H atof περιμένει ως όρισμα char*, εσύ όμως της περνάς char. To c αντί του ch είναι εκ παραδρομής, σωστά;

 

 

Χωρίς να γίνει ο κώδικας πολύ περίπλοκος (επειδή υποπτεύομαι ότι είσαι στην αρχή της εκμάθησης C), ορίστε μία εναλλακτική λύση που έγραψα στα γρήγορα. Πρέπει να δουλεύει:

 

 

 

>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>

#define NPROC 1
#define NR 14
#define NC 14
#define NRL (NR/NPROC)
#define NITER 1000


int main(int argc, char *argv[]) {
FILE *fp;
float item;
int i, j;
float t[NRL+2][NC+2];

fp = fopen("jacobi.txt","r");

for(i = 0; i <= NRL + 1; i++)
	for(j = 0; j <= NC + 1; j++) {
		fscanf(fp, "%f", &item);
		printf("%.0f ", item);
		t[i][j] = item;
	}

fclose(fp);

printf("\n\n");

for(i = 0; i <= NRL + 1; i++) {
	for(j = 0; j <= NC + 1; j++)
		printf("%.0f ", t[i][j]);

	printf("\n");
}

return 0;
}

 

 

 

 

Βέβαια, ούτε αυτή η προσέγγιση είναι καλή. Αν είχες αναπαράσταση πίνακα διαφορετικού μεγέθους; Θα έπρεπε να μετρήσεις αριθμό γραμμών,στηλών στο αρχείο και να δεσμεύσεις δυναμικά μνήμη για τον πίνακά σου. Μάλλον θέματα που θα συναντήσεις στην πορεία...

Δημοσ.

Καλησπερα!!Επαναφερω το θεμα στην επικαιροτητα γιατι εχω να αντιμετωπισω ακομα ενα θεμα.Τωρα το αρχειο που πρεπει να διαβασω εχει 3 στηλες.Ομως εγω πρεπει να διαβασω μονο την 3η στηλη του αρχειου.Αυτο θα το κανω με την fscanf??

>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>

#define NPROC 1
#define NR 1
#define NC 1
#define NRL (NR/NPROC)    
#define NITER 1000


int main(int argc, char *argv[]) {
   FILE *fp;
   float item;
   char c;
  	int i,j,iter,niter;
   float before[NRL+2][NC+2],after[NRL+2][NC+2];
  	float diff=0.0;
float Epsilon=0.001000;

  	float change;

   struct timeval Start, Stop, Diaf;   //metrhsh xronou 
   
   fp = fopen("dok.txt","r");

  for(i = 0; i <= NRL + 1; i++)
       for(j = 0; j <=NC +1; j++) {
           c = getc (fp);
           if ((c!=i)&&(c!=j)) 
           fscanf(fp, "%f", &item);
           printf("%.0f ", item);
           before[i][j] = item;
       }
*/
    
    
   fclose(fp);

   printf("\n\n");
   
    for(i = 0; i <= NRL + 1; i++) {
       for(j = 0; j <= NC + 1; j++)
           printf("%.0f ", before[i][j]);
   
       printf("\n");
   }

   fprintf(stderr,"How many iterations [100-1000]?");
scanf("%d",&niter);
if(niter>NITER)niter=NITER;  
   
   gettimeofday(&Start, NULL);
   
for(iter=1;iter<=niter;iter++)  //Basikos epanaliptikos broxos pou xrhsimopoiei niter epanalipseis
{
   for(i = 1; i < NRL + 1; i++)    {
       for(j = 1; j <NC + 1; j++)    {
           after[i][j]=0.25*(before[i+1][j]+before[i-1][j]+before[i][j+1]+before[i][j-1]);  
           printf("\n");
       
       if (fabs(after[i][j]-before[i][j])>diff)
        diff=fabs(after[i][j]-before[i][j]);
     }
}

if(diff<=Epsilon)
      break;
      
    gettimeofday(&Stop, NULL);  
   
for(i=1;i<NRL+1;i++) 
  for(j=1;j<NC+1;j++)  
    before[i][j]=after[i][j];
    }
   
   timersub(&Stop , &Start , &Diaf);
   fprintf(stdout,"SYNOLIKOS XRONOS:\n");
   
   fprintf(stdout,"Time: %6ld sec   %6ld microsec\n",Diaf.tv_sec,Diaf.tv_usec);
  return 0;
  
}

Αυτος ειναι ο κωδικας που μεχρι στιγμης εχουμε φτιαξει.Και το αρχειο που πρεπει διαβασω ειναι αυτο που επισυναπτω

 

 

Δηλαδη θελω απο το αρχειο να περνω την 3η στηλη και να την αποθηκευω στον πινακα before[j].Αν παρατηρησετε οι 2 πρωτες στηλες αναφερονται στο i,j

Καθε βοηθεια ευπροσδεκτη.

:cry::cry:

dok.txt

Δημοσ.

Για ρίξε μια ματιά σε αυτό το θέμα http://www.insomnia.gr/forum/showthread.php?t=251608, καθώς ζητάς περίπου τα ίδια πράγματα (μόνο που διαβάζεις από αρχείο και φυσικά η διάταξη των αριθμών διαφέρει), δεν είναι δύσκολο να προσαρμόσει τον κώδικα μου στις ανάγκες σου ή να πάρεις κάποιες ιδέες από αυτόν.

 

Καλή συνέχεια.

Δημοσ.
Για ρίξε μια ματιά σε αυτό το θέμα http://www.insomnia.gr/forum/showthread.php?t=251608, καθώς ζητάς περίπου τα ίδια πράγματα (μόνο που διαβάζεις από αρχείο και φυσικά η διάταξη των αριθμών διαφέρει), δεν είναι δύσκολο να προσαρμόσει τον κώδικα μου στις ανάγκες σου ή να πάρεις κάποιες ιδέες από αυτόν.

 

Καλή συνέχεια.

 

Βασικα με δυσκολευει διοτι εγω δεν θελω να διαβαζω απο την εισοδο αλλα κατευθεια απο το αρχειο.Καμια ιδεα πως μπορω να το αποφυγω αυτο?

Δημοσ.

Το stdin λειτουργεί ως FILE*, ακολουθεί το πρόγραμμα τροποποιημένο ώστε να διαβάζει το αρχείο σου (ως πρώτη παράμετρος του εκτελέσιμου) σε ένα 1D float array και να μην χρησιμοποιεί τα stdout / stderr κτλ.

 

Τα σχόλια μπορούν να σε καθοδηγήσουν στο πως & γιατί.

 

>
/*-Read "stdin" by Directx v2 for MD-----------------------------------------*/

#include <stdio.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
#define	_ARRAY_SIZE_LINE	9
#define	_ARRAY_SIZE_ITEMS	3

#ifdef	__BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
char szBuffer[bUFSIZ];
float f2DArray[_ARRAY_SIZE_LINE];
int	 nY = 0;

FILE *Stream = NULL;

/*
 * Open file for read
 */
if((Stream=fopen(argv[1],"r"))==NULL)
 {
	printf(" DOS Error: Cannot open file for read - %s\n", argv[1]);
	return -1;
 }

/*
 * Store "Stream" into szBuffer and then into f2DArray, 
 * stop if no data found or if we read more than _ARRAY_SIZE_LINE.
 */
while(fgets(szBuffer,sizeof(szBuffer),Stream) != NULL && nY<_ARRAY_SIZE_LINE)
 {			
       /* We can temporarly store here the preceding useless integers */
	static int nDummyVal;
	
	/* Read szBuffer integers into f2DArray */
	if(sscanf(szBuffer, "%d%d%f", &nDummyVal, 
								  &nDummyVal,
								  &f2DArray[nY])!=_ARRAY_SIZE_ITEMS)
	 {
		/* sscanf failed to read at least _ARRAY_SIZE_ITEMS -- program stops */
		printf("Malformed Stream - %s\n", argv[1]);
		fclose(Stream);
		return	-1;
	 }

	/* Move to next Array/Line */
	nY++;
 }	

/* Check if we read fewer than _ARRAY_SIZE_LINEs from file */
if(nY<_ARRAY_SIZE_LINE)
	printf("Lines count mismatched - %s (%d)\n", argv[1], nY);

/* Close opened file */
fclose(Stream);

/* Dump Array on screen, assume 1 digit (%.1f) float precision (0.70 => 0.7) */
for(nY = 0; nY < _ARRAY_SIZE_LINE; nY++)
	printf("%.1f\n", f2DArray[nY]);		
 
return 0;
}

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

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

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