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

Πρόβλημα σε C


macgyver

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

Δημοσ.

Αγαπητοί φίλοι,

 

έχω το εξής πρόβλημα:

 

έχω ένα αρχείο test.txt με ακέραιους της μορφής

 

1 6 0

8 2 4

3 5 7.

 

Αυτό που θέλω να κάνω είναι να διαβάσω το αρχείο και τους ακέραιους να τους σώσω σε ένα δισδιάστο πινακα.

Υπόψήν ότι η μορφή του αρχείου μπορεί να αλλάξει πχ

 

1 6 0 7

8 2 4 3

9 11 12 10

 

αλλά πάντα είναι συμμετρικό με μέγιστο 8χ8.

 

Ευχαριστώ εκ των προτέρων

 

Με εκτίμηση.

Δημοσ.

Πιθανή λύση:

Θα διαβάζεις γραμμή-γραμμή το αρχείο. Κάθε φορά λοιπόν που θα διαβάζεις μία γραμμή θα την δίνεις στην sscanf για να σου δώσει τους αριθμούς αλλά και το πλήθος αυτών:

 

>
...
int t[8]
int a[8,8];
char line [128];
int n = 0;
int m;
int i;
...

while (!<end_of_File>)
{
   /* read next line */
   m = sscanf(line, "%d %d %d %d %d %d %d %d",
                  &t[0], &t[1], &t[2], &t[3], &t[4], &t[5], &t[6], &t[7]);
   for (i=0; i<m;i++)
       a[n,i] = t[i];
  n++;
}

...

 

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

Δημοσ.

Η συνάρτηση είναι η ακόλουθη, αλλά δεν παίζει.Κάτι χάνω

 

int read_puzzle(puzzle_type puzzle, int side_length, FILE *out)

{

char FileName[81],Line[10]; /* needed for user entry of filenames */

int Lines=2,Counter=2;

int i=0,j=0;

int k[8],m;

int ReadFile[8][8];

 

printf("give filename\n");

scanf("%s",FileName);

 

out =fopen(FileName,"r");

if (out==NULL)

{

printf("\nError Opening The File..\n");

fclose (out);

return 0;

}

 

fscanf (out,"%d",&side_length); // ÄéáâÜæïõìå ìüíï ôïí ðñþôï áñéèìü ðïõ

printf ("The SideLenght is : %d\n",side_length);//áðïôåëåß ôï side_length

 

while (!feof(out))

{

if (Lines==Counter)

{

m = sscanf (Line,"%d %d %d %d %d %d %d %d",k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7]);

for (i=0; i<m;i++)

ReadFile[Lines] = k;

Lines++;

Counter++;

 

}

}

 

printf("\n\n");

 

fclose (out);

 

return (side_length);

Δημοσ.

Δε χρειάζεται να το κάνεις τόσο πολύπλοκο.. διαβάζεις με scanf πχ ένα ένα αριθμό σε μία επανάληψη η οποία θα έχει συνθήκη τερματισμού όταν βρίσκει "\n" δηλαδή τέλος γραμμής. και ταυτόχρονα με ένα απλό counter υπολογίζεις πόσα στοιχεία διάβασες από την κάθε σειρά.

 

και επίσης καλύτερα να κάνεις δυναμική δέσμευση γιατί πολύς χώρος πάει χαμένος έτσι.

Δημοσ.

Κάτι πιο απλό

 

int read_puzzle(puzzle_type puzzle, int side_length, FILE *out)

{

char FileName[81]; /* needed for user entry of filenames */

int counter=0;

int i=0,j=0;

int ReadFile[10];

 

printf("give filename\n");

scanf("%s",FileName);

 

out =fopen(FileName,"r");

if (out==NULL)

{

printf("\nError Opening The File..\n");

fclose (out);

return 0;

}

 

fscanf (out,"%d",&side_length); // ÄéáâÜæïõìå ìüíï ôïí ðñþôï áñéèìü ðïõ

printf ("The SideLenght is : %d\n",side_length);//áðïôåëåß ôï side_length

 

while(!feof(out))

{

fscanf(out,"%d",&ReadFile[counter++]);

}

fclose(out);

 

for (i=0;i<9;i++)

// for (j=0;j<side_length;j++)

printf("%d\n", ReadFile);

 

return (side_length);

 

}

 

Εδώ πάνω τώρα πως μπορώ να παίξω με 2D πίνακα;

 

Αγαπητέ pinball_elf δοκίμασα τον κώδικά αλλά κατά την εκτέλεση το πρόγραμμα περίμενε και δεν έκανε τίποτα.

Δημοσ.

Με εναν συνδυασμο fscanf & fgetc

>#include "stdafx.h"



int _tmain(int argc, _TCHAR* argv[])
{
int mat[8][8];
int x=0,y=0;
FILE *f=fopen("e:\\test\\t.txt","r");

while(fscanf(f,"%d",&mat[y][x])!=EOF)
{
	x++;
	if(fgetc(f)=='\n')
	{
		y++;
		x=0;
	}
}
   fclose(f);
	return 0;
}

και το output

post-103086-12906313579_thumb.jpg

Δημοσ.

Πιο απλή η λύση του Evgenios1, είχα σκεφτεί και την fscanf σαν πρώτη λύση, αλλά προτιμώ την sscanf:

 

>
#include <stdio.h>

int readline(FILE*, char*);

int main (void)
{
 int t[8];
 int n;
 int l = 0;
 int m;
 int i, j;
 char line[128];
 int a[8][8];
 FILE * Fptr;

 if ( (Fptr = fopen("array_data.dat","r")) == NULL)
   fprintf(stderr, "ERROR : cannot open file %s for reading!\n", "array_data.dat");
 else
 {
   while(1)
   {
     if ( (n = readline(Fptr, line)) >0)
     {
       m = sscanf (line, "%d %d %d %d %d %d %d %d",
                             &t[0], &t[1], &t[2], &t[3], &t[4], &t[5], &t[6], &t[7]);

       /*  m = number of successfully matched and assigned input items from sscanf */

       for (j=0; j<m; j++)
         a[l][j] = t[j];

       l++; /* next line */
     }
     else
       break;
   }
   fclose(Fptr);
   printf("\n");
   for (i=0; i<l; i++)
   {
     for (j=0; j<m; j++)
       printf("%d ", a[i][j]);
     printf("\n");
   }
 }
 return 0;
}

int
readline(FILE* fstream, char* line)
{
 char c = '\0';
 int n = 0;
 int i = 0;

 while (c != '\n')
 {
   /* read one character at a time */
   if ( (i = fread(&c, 1, 1, fstream)) > 0 )
   {
     line[n] = c;
     n++;
   }
   else
   {
     line[0] = '\0';
     return 0;
   }
 }

 line[n-1] = '\0';

 return (n);
}

Δημοσ.

Αγαπητοί φίλοι,

 

Τελικά αυτό που μου πρότεινε ο Evgenios1 έπαιξε και είναι η πιο απλή λύση.

 

Οφείλω να ομολογήσω πως όλοι σας με βοηθήσατε πάρα πολύ.

 

Σας ευχαριστώ θερμά, να είστε όλοι καλά.

  • 2 εβδομάδες αργότερα...
Δημοσ.

γεια σας παιδια εχω και εγω μια απορια σε κατι παρομοιο.

εστω οτι εχω το txt αρχειο. χρησιμοποιω την read.

πως μπορω αποθηκευσω τους αριθμους αυτους σε ενα πινακα αλλα με 2 ψηφια για τον καθε αριθμο δλδ

01 06 00

08 02 04

09 11 12

 

int read(puzzle_type puzzle, FILE *out)

{

char filename[81];

 

int k,m,s;

printf("give filename\n");

scanf("%s",filename);

 

out = fopen(filename,"r");

 

if (out==NULL) {

printf("\nError Opening The File..\n");

fclose (out);

return 0;

}

 

fscanf(out, "%d", &s);

 

for(k = 0; k < s; k++){

for(m = 0; m < s; m++)

 

fscanf(out,"%d", &puzzle[k][m]);

 

}

fclose(out);

}

Δημοσ.

θελω απο ενα αρχειο txt με ακεραιους της μορφης

1 6 0

8 2 4

9 11 12

να τους διαβασω και να τους αποθηκευσω σε ενα πινακα αλλα τους μονοψηφιους με δυο ψηφια δηλαδη αντι για 1 να ειναι 01 αντι για 6 06

 

η συναρτηση ειναι μερος ολοκληρης της ασκησης που προσπαθω να λυσω

Δημοσ.

Μα δεν χρειάζεται να τους αποθηκεύσεις ως 01, 02, κ.λ.π, όταν θες να τους τυπώσεις θα τους τυπώνεις 01, 02, κ.λ.π...

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

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

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