panayiotispatra Δημοσ. 12 Νοεμβρίου 2007 Δημοσ. 12 Νοεμβρίου 2007 Γιατί δεν μου διαβάζει ο file που του δίνω από την γραμμή εντολών. Σας δίνω το κομμάτι που νομίζω ότι βρίσκεται το πρόβλημα. Αν μπορεί κάποιος να βοηθήσει. Σκοπός του συγκεκριμένου είναι να εκτυπώσω ένα text file για sudoku void printMatrix(int array[9][9]) { char filename[30]; FILE *fp; int i,j,z; fp=fopen(filename,"r"); if(fp==NULL) { printf("Cannot open file!\n"); } while((z=fgetc(fp))!=EOF){ printf("|-|-|-|-|-|-|-|-|-|\n"); for(i=0;i<9;i++) { for(j=0;j<=9;j++) { z = fgetc(fp); printf("|%c",z); array[j] = z; } } printf("\n"); printf("|-|-|-|-|-|-|-|-|-|\n"); } } Μου βγάζη το error Cannot open file! 12 [main] a 3128 _cygtls::handle_exceptions: Error while dumping state (pro bably corrupted stack) Segmentation fault (core dumped)
Red_Phantom Δημοσ. 13 Νοεμβρίου 2007 Δημοσ. 13 Νοεμβρίου 2007 Πού ακριβώς περνάς το file σαν όρισμα? void printMatrix(int array[9][9]) { char filename[30]; FILE *fp; int i,j,z; fp=fopen(filename,"r"); if(fp==NULL) ... Απο το κομμάτι του κώδικα που έδωσες δεν βλέπω να παίρνει τιμή κάπου το filename
bokarinho Δημοσ. 13 Νοεμβρίου 2007 Δημοσ. 13 Νοεμβρίου 2007 Θεωρώ πως θα πρέπει να φτιάξεις μία συνάρτηση που θα διαβάζει αρχικά από ένα αρχείο το Sudoku σου και κατόπιν έχοντας διαβάσει μέσα στον πίνακα τις τιμές του puzzle από το αρχείο με μία διαφορετική συνάρτηση να τυπώνεις το puzzle.Δεν είναι καλή πρακτική έτσι όπως το πας, γνώμη μου, imho!!!
panayiotispatra Δημοσ. 13 Νοεμβρίου 2007 Μέλος Δημοσ. 13 Νοεμβρίου 2007 Το file το ορίζω στην αρχη int main (int argc, char *argv[]) { int X, Y, val; int isInterrupted = 0; int sudoku[9][9]; FILE *fp; /* Sanity Check - Check the existence of the command-line argument */ if (argc < 2) { printf("Usage: %s <input-file>\n", argv[0]); exit(1); } /* Opening the specified input file in read mode*/ if ( (fp = fopen (argv[1], "r")) == NULL) { printf ("Failed to open the input file '%s'.\n", argv[1]); exit(EXIT_FAILURE); } . . . .
bokarinho Δημοσ. 13 Νοεμβρίου 2007 Δημοσ. 13 Νοεμβρίου 2007 Είσαι έτοιμος, απλά να φροντίσεις στον φάκελο που έχεις τα αρχεία κώδικα δηλαδή τα .c να βάλεις στο debug φάκελο ή γενικά αν δεν δουλέψει το αρχείο κειμένου sudoku.txt για να το βρει το πρόγραμμα και να δουλέψει γιατί αλλιώς θα σου λέει ότι δεν βρίσκει το αρχείο. > #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 9 /* Read a Sudoku file in an input array. */ int ReadSudokuPuzzle(const char *filename, int Sudoku[][N]) { if(!filename) { fprintf(stderr,"Error: ReadSudokuPuzzle(): Enter a valid file name.\n"); return -1; } else { FILE *file = NULL; int i = 0,j = 0; if((file = fopen(filename, "rt")) == NULL) { fprintf(stderr,"Error: ReadSudokuPuzzle(): Can not open '%s' file.\n", filename); return -2; } else { while(fscanf(file, "%d", &Sudoku[i][j]) != EOF) { j++; if(j == N) { i++; j = 0; } } /* Close file. */ fclose(file); return 0; } } } /* Print Sudoku in stdin. */ void PrintSudoku(int Sudoku[][N]) { int i, j; printf("-------Sudoku Puzzle--------\n\n"); for(i = 0; i < N; i++) { printf("|--|--|--|--|--|--|--|--|--|\n"); for(j = 0; j < N; j++) { printf(" %d ", Sudoku[i][j]); } printf("\n"); } printf("|--|--|--|--|--|--|--|--|--|\n"); printf("\n"); } /* Write Sudoku to a file. */ int WriteSudokuPuzzle(char *filename, int Sudoku[][N]) { if(!filename) { fprintf(stderr,"Error: WriteSudokuPuzzle(): Enter a valid file name.\n"); return -1; } else { FILE *file = NULL; int i = 0,j = 0; if((file = fopen(filename, "wt")) == NULL) { fprintf(stderr,"Error: WriteSudokuPuzzle(): Can not open '%s' file.\n", filename); return -2; } else { fprintf(file,"%s", "-------Sudoku Puzzle--------\n\n"); for(i = 0; i < N; i++) { fprintf(file, "%s", "|--|--|--|--|--|--|--|--|--|\n"); for(j = 0; j < N; j++) { fprintf(file," %d ", Sudoku[i][j]); } fputc('\n', file); } fprintf(file, "%s", "|--|--|--|--|--|--|--|--|--|\n\n"); fclose(file); return 0; } } } /* Main code. */ int main(int argc, char **argv) { /* Global Sudoku Array. */ int Sudoku[N][N] = {{0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}}; /* */ ReadSudokuPuzzle("sudoku.txt", Sudoku); PrintSudoku(Sudoku); WriteSudokuPuzzle("output.txt", Sudoku); printf("Hit enter to continue....\n"); getchar(); } Sudoku.txt 0 0 0 0 0 4 6 7 2 2 3 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 4 6 0 0 0 0 3 0 0 7 9 0 2 0 0 0 0 4 5 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0 6 0 4 5 0 0 0 0 7 0 0 1 2 3 7 0 0 0 0 9
bokarinho Δημοσ. 13 Νοεμβρίου 2007 Δημοσ. 13 Νοεμβρίου 2007 Το file το ορίζω στην αρχη int main (int argc, char *argv[]) { int X, Y, val; int isInterrupted = 0; int sudoku[9][9]; FILE *fp; /* Sanity Check - Check the existence of the command-line argument */ if (argc < 2) { printf("Usage: %s <input-file>\n", argv[0]); exit(1); } /* Opening the specified input file in read mode*/ if ( (fp = fopen (argv[1], "r")) == NULL) { printf ("Failed to open the input file '%s'.\n", argv[1]); exit(EXIT_FAILURE); } . . . . Εφόσον το αρχείο το ανοίγεις μέσα στην main() και όχι μέσα στις συναρτήσεις κάθε φορά, όπως και σωστά αλλά όχι απαραίτητα πράττεις, τότε στην printMatrix θα πρέπει να την ορίσεις έτσι: void PrintMatrix(int Array[][9], FILE *file) { } και όταν στην main() την καλέσεις την καλείς ώς: PrintMatrix(Sudoku, fp); Βέβαια να θυμάσαι ότι μέσα στην συνάρτηση που θα ορίσεις δεν θα πρέπει να ξανανοίγεις το αρχείο αλλά να το θεωρείς ανοιχτό γιατί το έχεις ήδη άνοιξει μέσα στην main() συνάρτηση σου σαν global αρχείο. Δηλαδή εφόσον έχεις κάνει αυτό: if ( (fp = fopen (argv[1], "r")) == NULL) { printf ("Failed to open the input file '%s'.\n", argv[1]); exit(EXIT_FAILURE); δεν χρειάζεται να κάνει αυτό μέσα στην συνάρτηση: char filename[30]; FILE *fp; int i,j,z; fp=fopen(filename,"r"); if(fp==NULL) { printf("Cannot open file!\n"); } Ελπίζω να βοήθησα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.