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

πρόβλημα με path στη C..


karabouzouk...

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

Δημοσ.

Η ερώτηση μου αφορά την εντολή x=fopen("records.dat","r+"); για παραδειγμα...

Στη θέση του records.dat μπορώ να βάλω και την ακριβή διεύθυνση του αρχείου...

Τι γίνεται αν θέλω να "περασω" τη διεύθηνση στην εντολή μέσω μιας μεταβλητης συμβολοσειράς για παραδειγμα.... Δλδ αν θέλω να ρωτήσω το χρήστη "που θέλεισ να αποθηκευτούν οι πληροφοείες" και μετα να κανω scanf σε μια μεταβλητή το path και να τη χρησιμοποιήσω στην fopen πχ...

Ευχαριστώ!

Δημοσ.

Γίνεται μια χαρά αυτό που λες. Πού περίμενες να υπάρχει πρόβλημα;

 

Δες π.χ. τον παρακάτω κώδικα, ένα παράδειγμα αυτού που θέλεις να κάνεις, αλλά με δημιουργία αρχείου:

 

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


int main(void) {
char Path[256];
FILE *outfile;

printf("This program writes a \"Hello World!\" message to a file with variable path determined by the user\n\n");
printf("Enter path for output file: ");
scanf("%s", Path);

if(strlen(Path) + strlen("HelloWorld.txt") > 255)
	return 1;

strcat(Path, "HelloWorld.txt");

if((outfile = fopen(Path, "w")) == NULL)
	return 2;

fprintf(outfile, "Hello World!\n");
fclose(outfile);

return 0;
}

Δημοσ.

Πόσο γελοίο μπορούσε να είναι....

Απλά είμαι αρχάριος και τώρα τα έμαθα αυτα και μου είχε μείνει σαν γενική μορφή οτι η μεταβλητή του path η το path αυτό καθ αυτο πρέπει να είναι σε "..."

Τέλος πάντων τώρα μου φένεται πως ήταν γελοίο να το σκευτώ....

Ευχαριστώ πάντως....

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

Το έκανα έτσι όπως ακριβώς στο παράδειγμα που μου είπες αλλά ο compiler βγάζει error ότι δεν συντάσσω σωστά τη συνάρτηση....

Έχω το Turbo C αν υπάρχει περίπτωση να φταίει αυτο...

Δημοσ.

Πολύ πιθανόν, μιλάμε για πανάρχαιο compiler. Σε GCC 3.4.2 και 4.3.1 γίνεται compile και τρέχει μια χαρά, πάντως.

 

Για κάνε ένα copy-paste τον κώδικα που τελικά έγραψες και το ακριβές μήνυμα λάθους του Turbo C...

Δημοσ.

Κώδικας:

 

if(ep==1)

b=fopen("Data_DMJB.dat","r+");

 

if(ep==2){

printf("\nDwse onoma arxeiou dedomenwn..\n\n Onoma --> ");

scanf("%s",path_name);

b=fopen(path_name,"r+");

if(!B)

b=fopen(path_name.dat,"r+");

}

 

if(ep==3){

printf("\nDwse dieuthynsh dedomenwn me onoma arxeiou..\n\n Dieuthynsh --> ");

scanf("%s",path_name);

b=fopen(path_name,"r+");

if(!B)

b=fopen(path_name.dat,"r+");

}

 

if(!B){

printf("\nLathos plhktrologhsh. Ksanaprospathhste h pathste 4 gia dhmiourgia\n");

flag=1;

}

 

 

 

 

 

 

Μηνύματα σφαλμάτος:

 

για κάθε φορά που χρησιμοποιώ το b=fopen(path_name.dat","r+") μου βγάζει Illegal structure operation in function main...

 

Βασικά τώρα παρατήρησα οτι έβγαλε σφάλμα μόνο οταν έγραφα path_name.dat και όχι οταν έβαζα σκέτο το path_name μεσα στην fopen.. μάλλον αυτό ειναι το λάθος..

Απλά υπέθεσα οτι μπορεί ο χρήστης να μην γραψει στο τέλος του path ότι .dat

Αυτό χρειάζεται να μπει έτσι δεν είναι..? Αν είναι έτσι όπως τα είπα με ποια συνάρτηση θα ενσωματώσω το .dat στο υπόλοιπο path..?

Και αφού σε ευχαρηστήσω που ασχολήθηκες ποιο compiler μου πρωτείνεις να χρησιμοποιώ..?

Δημοσ.

Όταν έχεις αποθηκευμένο ένα path στον πίνακα χαρακτήρων με όνομα path_name, δε μπορείς απλά να κολλήσεις ένα .dat στο τέλος του ονόματος του πίνακα και να θεωρήσεις ότι βγαίνει κάποιο νόημα από αυτό. Στον παρακάτω κώδικα:

>b=fopen(path_name.dat,"r+");

...ο compiler βλέπει την τελεία και θεωρεί ότι αναφέρεσαι στο μέλος dat ενός struct με όνομα path_name. Εσύ όμως έχεις ορίσει το path_name ως πίνακα χαρακτήρων και όχι ως struct. Εξ ου και το λάθος. Αν πρόσεξες στο αρχικό post μου, ένωνα το string που περιέχει το path και το string που περιέχει το filename με τη συνάρτηση strcat. Κάτι παρόμοιο θα πρέπει να κάνεις κι εσύ.

 

 

Προτάσεις για περιβάλλοντα ανάπτυξης C και C++ υπάρχουν πάρα πολλές. Κάνε μία Αναζήτηση στην παρούσα ενότητα του Προγραμματισμού π.χ. για τον όρο Dev-C++ ή CodeBlocks και διάβασε ολόκληρα τα θέματα στα οποία εμφανίζονται αυτές οι λέξεις για να πάρεις μία ιδέα.

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

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

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