Bonjour, je suis débutant en language C, je n'arrive pas à ouvrir un fichier. Depuis 3h, je suis bloqué et je cherche sur les forums mais je ne trouve pas la solutions (je n'ai peut être pas bien cherché en même temps). Voici mon code :
Merci pour la réponse et pour l'info mais le code (ci-dessus) ne fonctionne toujours pas. Pour info (au cas où), j'utilise Code::Blocks. De plus, normalement, je crée un fichier qui devrait se trouver dans le dossier de l'exécutable mais il n'y a rien. J'ai recherché dans tout le pc un fichier du nom "test", "test.txt", "fichier", etc... et rien.
int main(int argc, char *argv[])
{
FILE *fichier = NULL, *fichier1=NULL, *fichier2=NULL;
fichier = fopen("C:\\Utilisateurs\\basti\\Bureau\\programmation\\programme\\ouvrir fermer fichier\\test.txt", "r+");/*J'ouvre le fichier que je nomme "test.text" avec la posssibilité de lire
et d'écrire dans le fichier (r+) avec la fonction fopen*/
if (fichier != NULL)
{
printf("Fichier ouvert!");
fclose(fichier);
}
else
{
perror("test.txt");
}
et la réponse : test.txt: No such file or directory
Le répertoire des utilisateurs ne s'appelle-t-il pas plutôt "C:\Users" sous Windows ? (Il s'affiche comme "Utilisateurs" dans l'explorateur mais je sais que sous Windows 7 son vrai nom est "Users". Pour les Windows suivants je ne sais pas. Et puis ça se trouve ça marche avec les deux noms, là je propose ça juste comme une piste, au cas où.)
J'ai recherché dans tout le pc un fichier du nom "test", "test.txt", "fichier", etc... et rien.
C'est pas la peine de chercher, tu ne le trouveras pas.
Pour ouvrir un un fichier avec le mode "r", le fichier doit exister !
Aussi avec une exécution depuis Code::Blocks le répertoire courant n'est pas forcément celui de l’exécutable, mais celui mentionné dans les propriété du Projet.
Prends le problème autrement : fais un programme qui _écrit_ dans un fichier "essai.txt". Tu verras bien où il arrive.
PS: les noms de fichiers et de dossiers avec des espaces et des caractères bizarres, c'est toujours le boxon sous windows. Et avec des noms à rallonge, il y a 3 chances sur 2 qu'il y ait une faute de frappe.
Pour faire des tests, un répertoire C:\\Windows\\TEMP, c'est bien aussi. Astuce : on peut utiliser des / au lieu de \\, soit "C:/Windows/TEMP".
Pour la petite histoire, Bill Gates aurait bien voulu avoir des / dans les chemins d'accès comme sous Unix dont il était un fan, mais le / était déjà pris pour noter les options des commandes MS-DOS, un truc pompé sur CP/M.
Désolé pour l'attente, je vérifie si le fichier existe en regardant dans le fichier de l'exécutable et avec la réponse que je reçoit sur la boîte noir avec le vérificateur d'ouverture.
Et il m'écris la même réponse. Je suis allé voir dans le fichier (qui a été modifié à l'heure de la compilation) et il n'y a pas le fichier "essai.txt"
Je ne te demandais pas de vérifier si existait mais si il existe !?!
Il faut lire les réponses que l'on t'apporte, sinon ce n'est pas la peine de venir poser des questions sur le forum !
Donc au vu des indication que tu apportes, je suppose qu'il n'existe pas.
Donc comme je te l'ai dit plus haut et que tu 'as pas lu, ce n'est pas la peine d'aller le chercher, tu ne le trouvera pas ! (le mode "r" de fopen échoue si le fichier n'existe pas !)
Avec une persévérance toute agricole, tu zappes toujours la même partie dans nos explications : il faut que le fichier existe avant, ca ne va pas le créer.
fopen(...., "r+"), ça sert à ouvrir un fichier existant
et si le fichier n'existe pas préalablement, ça fait couiner avec "No such file or directory", forcément.
C'est écrit dans la doc
The argument mode points to a string beginning with one of the follow‐
ing sequences (possibly followed by additional characters, as described
below):
r Open text file for reading. The stream is positioned at the be‐
ginning of the file.
r+ Open for reading and writing. The stream is positioned at the
beginning of the file.
w Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.
w+ Open for reading and writing. The file is created if it does
not exist, otherwise it is truncated. The stream is positioned
at the beginning of the file.
a Open for appending (writing at end of file). The file is cre‐
ated if it does not exist. The stream is positioned at the end
of the file.
a+ Open for reading and appending (writing at end of file). The
file is created if it does not exist. The initial file position
for reading is at the beginning of the file, but output is al‐
ways appended to the end of the file.
Si tu veux que ça crée le fichier dans le cas où il n'existe pas, c'est le mode a+ ou r+(edit) w+ si tu veux à la fois lire et écrire, selon ce que tu veux exactement
#include <stdio.h>
const char *mode =
// "r+"; // lecture et écriture au début d'un fichier existant
"a+"; // création éventuelle, lecture au début/écriture à la fin
// "w+"; // création éventuelle, lecture et écriture au début
int main()
{
FILE *fichier = fopen("test.txt", mode);
if (fichier != NULL) {
printf("Fichier ouvert!");
fclose(fichier);
} else {
perror("Ouverture fichier");
}
}
Excusez-moi, je ne suis pas très attentif et merci beaucoup, ça fonctionne. Mais j'ai une autre question : Comment peut-on créer un fichier? Je pensais que c'était en créant la variable pointeur "fichier" de type FILE, donc, y-a-t-il un autre moyen de le créer au lieu de mettre le mode a+ dans le fopen?
Merci pour vos réponses précises et rapides et de m'avoir aider pour ce problème.
Pour créer un fichier : avec fopen ou creat qui est un synonyme du bon vieux temps où les noms de fonction avaient 5 lettres au plus. Pourquoi tu ne veux pas l'utiliser, alors que ça fait le boulot, et correctement ?
On peut créer avec le mode w+ aussi. Bon, il y a open aussi.
Ces cours de daube utilisent à tort et à travers le mot créer, que c'en est une calamité.
Tu ne crée pas une variable, tu la déclares. Et déclarer une variable, ça ne fabrique pas un nouveau fichier sur ton disque dur. Pour ça, il faut appeler une fonction de bibliothèque qui demande au système de le faire.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Merci pour la réponse et pour l'info mais le code (ci-dessus) ne fonctionne toujours pas. Pour info
J'ai modifié le code et la réponse est toujours "test.txt: No such file or directory".
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent