Problème Header (getch) + ouverture fichier binaire
Bonjour à tous !
J'ai un petit problème dans mon programme, assez facile à résoudre, mais je ne comprends pas pourquoi !
Il est composé de plusieurs fonctions. Hier, j'ai ajouté la prise en charge des arguments ( int main(int argc, char *argv[]) au lieu de int main(); )
Or, pour tester la boucle d'affichage des arguments, j'ai fait un petit programme à part :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for (i=0; i < argc; i++)
{
printf("Argument %i : %s \n", i, argv[i]);
}
getch();
return 0;
} |
Dev c++ indique une erreur sur getch();
après plusieurs recherches, j'ai vu qu'il fallait inclure <conio.h>
Effectivement, ça fonctionne à merveille !
Cependant, dans mon gros programme initial qui utilise et abuse du getch(), il n'y a pas de <conio.h>, pourtant, il fonctionne aussi !
Je me dis : peut être que getch() est aussi définie dans un autre header...
Mais quand je copie tous les INCLUDES du gros vers le petit programme (stdlib.h stdio.h math.h io.h fcntl.h string.h), même problème, Dev écrit un truc du genre 'undeclared'.
Je n'ai pas rédigé d'autre fonction getch() dans mon programme, alors, est-ce un bug du compilateur ? Dans un gros programme, est-ce qu'une déclaration peut être implicite ? Bref, qu'est ce qui explique cette incohérence ?!8O
Mon second problème vient d'une fonction du programme.
En gros, j'ai construit une structure Fichier, comprenant le chemin et le nom du fichier, ainsi qu'une fonction qui prend en paramètre cette structure (1) et une chaîne de caractères.
Elle crée un fichier, l'ouvre (en binaire) et écrit la chaîne dedans.
Avant, on saisissait toutes les informations du fichier dans une fonction de saisie, on appelle (1), et ça fonctionnait à merveille!
Maintenant, je construit un fichier avec les arguments de main (après bien entendu un bricolage et une extraction des chaînes de caractères), l'affichage du nom, prénom est correct, mais la fonction crée un fichier en lecture seule !, donc le programme plante sur ma fonction d'écriture !!:aie:
Pourquoi ya a t-il une différence de traitement de cette fonction alors qu'à priori le fonctionnement est similaire ???
Je tourne vraiment en rond et ça devient presque lourd !:evilred:
Est-ce que quelqu'un peut m'aider ????????????????
Merci d'avance !!!:king:
problèmes de passage Open / fopen
Salut à tous !
Au début de la discussion, j'avais créé un programme qui utilisait la fonction open pour manipuler les fichiers.
Je trouvais plusieurs avantages à cela : sobre, clair, mode binaire.
Depuis, j'ai réalisé un programme qui ouvre un fichier, lit certaines données et les modifie selon plusieurs paramètres.
Cela peut s'apparenter à un programme qui ouvre un fichier où est stockée une playliste par exemple, lit les fichiers dans la liste, leur Hash, vérifie s'ils sont disponibles sur le DD et enlève les occurences désuettes (exemple pour simplifier).
Le problème est que l'on me demande de convertir mes fonctions "open" en "fopen". Je suis d'accords, mais dans le code simplifié suivant :
-------
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
if ( (fich=fopen (chemin, "wb+")) == NULL)
{
fprintf(stderr,"Impossible d'ouvrir le fichier données\n");
free(ligne);
getch();
return(1);
}
printf("Ouverture du ficher : %s\n",chemin);
fseek (fich , 0 , SEEK_END); /*Trouver la taille du fichier*/
taille = ftell (fich);
rewind (fich);
printf("\nAccompli : taille du fichier : %d ",taille); |
-----------
Je me retrouve devant le fait qu'il n'existe apparemment pas de fonction qui donne la taille du fichier directement (comme filelenght() avec open). Ce n'est pas très grave.
Mais surtout, je n'arrive pas à créer un mode parmi :
/*
"r" ouverture d'un fichier texte en lecture.
"w" ouverture d'un fichier texte en écriture.
"a" ouverture d'un fichier texte en écriture à la fin.
"rb" ouverture d'un fichier binaire en lecture.
"wb" ouverture d'un fichier binaire en écriture.
"ab" ouverture d'un fichier binaire en écriture à la fin.
"r+" ouverture d'un fichier texte en lecture/écriture.
"w+" ouverture d'un fichier texte en lecture/écriture.
"a+" ouverture d'un fichier texte en lecture/écriture à la fin.
"r+b" ou "rb+ ouverture d'un fichier binaire en lecture/écriture.
"w+b" ou "wb+ ouverture d'un fichier binaire en lecture/écriture.
"a+b" ou "ab+ ouverture d'un fichier binaire en lecture/écriture à la fin.
*/
qui me permette de "mettre à jour mon fichier".
j'ai lu sur un autre forum que "wb+" le faisait, mais cela ne fonctionne pas ici, sous KDE, ce mode écrase irrémédiablement le fichier.
Le mode append me permet pas de modifier le milieu du fichier.
La solution que je vois proposée serait de créer un fichier temporaire, mixer dedans mes données, supprimer la source et renommer le fichier temporaire.
Cependant, mon programme doit manipuler des fichiers de plusieurs GigaOctets, donc :
->Existe-t-il un mode me permettant juste de modifier les données à l'intérieur d'un fichier avec fopen ?
-> Puis-je avoir la taille autrement (sans les API windows) ?
-> Est-il préférable de conserver open ?
Merci pour toute aide !
PS : désolé pour la longueur un peu barbare du message, mais je souhaitais poser la question aussi précisément que possible.