[C] problème de fichiers

problème de fichiers [C] - C - Programmation

Marsh Posté le 08-01-2012 à 16:00:28    

Bonjour,
 
J'ai un problème pour transférer des datas.
Au dessus d'un certain nombre ça foire!
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define  UI32 unsigned __int32
  5. #define  FN_MAX_SIZE 64            // max file path/name
  6. void
  7. main(int argc, char *argv[])
  8.   {
  9.   UI32      i;
  10.   char      inpname[FN_MAX_SIZE], outname[FN_MAX_SIZE];
  11.   FILE      *finp, *fout;
  12.   if (argc != 3)
  13.     {
  14.     printf("%s\n", "Usage: " );
  15.     exit (1);
  16.     }
  17.   /* Store arguments */
  18.   strncpy(inpname, argv[1], FN_MAX_SIZE);
  19.   strncpy(outname, argv[2], FN_MAX_SIZE);
  20.   /* Open input file */
  21.   finp = fopen(inpname,"r" );
  22.   if (finp == NULL) exit(2);
  23.   /* Open output file */
  24.   fout = fopen(outname,"w" );
  25.   if (fout == NULL) exit(3);
  26.   i = 2934129;
  27.   while(i)
  28.     {
  29.     fputc(getc(finp),fout);
  30.     i--;
  31.     }
  32.   fclose(finp);
  33.   fclose(fout);
  34.   }


 
Enregistre 2939145 bytes avec Watcom.
Le bon nombre avec gcc mais toutes les datas au dessus de 8548 sont à 0xff.
 
Donc il y a un problème, mais lequel?
 
Merci pour votre temps.
 
Bye,
Jean-Louis


Message édité par jlnh le 08-01-2012 à 16:33:15
Reply

Marsh Posté le 08-01-2012 à 16:00:28   

Reply

Marsh Posté le 08-01-2012 à 17:46:55    

Salut
 
3 questions
1) tu es sur quel OS
2) que contiennent les fichiers (du texte ou du binaire comme image, son, vidéo, etc)
3) c'est quoi ce "i = 2934129" ???

Reply

Marsh Posté le 08-01-2012 à 17:55:48    

1) console windows 7
2) binaire
3) Une valeur qu'il devait me transférer dans le programme d'origine
      j'ai réécris un programme juste avec le problème.
 
Exécution du programme principal:
 

Code :
  1. E:\Sources\new>m4p file.m4p file.m4a
  2. feof: 0
  3. Execute ftyp!
  4. feof: 0
  5. Execute moov
  6. Start sub_moov for 108 bytes
  7. moov -> mvhd for 100 bytes
  8. Fill for 100 bytes
  9. Filled with 100 bytes
  10. Start sub_moov for 2934129 bytes
  11. moov -> trak for 2934121 bytes
  12. Fill for 2934121 bytes
  13. Filled with 2934121 bytes
  14. Too much i = 209174 j = 538976288
  15. Start sub_moov for 538976288 bytes
  16. Tag 20202020 unknow sub_moov
  17. Fill for 538976280 bytes
  18. ^C
  19. E:\Sources\new>

Message cité 1 fois
Message édité par jlnh le 08-01-2012 à 18:00:34
Reply

Marsh Posté le 08-01-2012 à 18:31:55    

OK, sorry ce n'est pas un problème C.
 
Il fonctionne sous Linux:
 

Code :
  1. [root@ns new]# ./a.out file.m4p file.m4a
  2. feof: 0
  3. Execute ftyp!
  4. feof: 0
  5. Execute moov
  6. Start sub_moov for 108 bytes
  7. moov -> mvhd for 100 bytes
  8. Fill for 100 bytes
  9. Start sub_moov for 2934129 bytes
  10. moov -> trak for 2934121 bytes
  11. Fill for 2934121 bytes
  12. Start sub_moov for 14715 bytes
  13. moov -> trak for 14707 bytes
  14. Fill for 14707 bytes
  15. Start sub_moov for 194459 bytes
  16. Tag 75647461 unknow sub_moov
  17. Fill for 194451 bytes
  18. Return from sub_moov
  19. feof: 0
  20. Execute mdat


 
Comment faire tourner ce programme sous Windows?


Message édité par jlnh le 08-01-2012 à 18:49:28
Reply

Marsh Posté le 08-01-2012 à 19:09:56    

jlnh a écrit :

1) console windows 7
2) binaire
3) Une valeur qu'il devait me transférer dans le programme d'origine
 
...OK, sorry ce n'est pas un problème C.
 
Il fonctionne sous Linux:
Comment faire tourner ce programme sous Windows?


 
Tu remarques que ma question 1 avait son importance. :bounce:  
Lorsqu'on ouvre un fichier binaire sous Windows, il faut rajouter "b" au mode d'ouverture => fopen(..., "rb" ) ou fopen(..., "wb" ). C'est dû à la façon spéciale qu'à windows de considérer les fichiers textes et donc lui demander de ne pas considérer le fichier comme du texte.
Ce problème n'existe pas sous Linux qui considère tous les fichiers comme fichiers binaires (merci encore une fois à Windows de tout compliquer à plaisir).
 
Toutefois je suis surpris de ta réponse 3. Tu dis que i est une "valeur à transférer" mais tu t'en sers comme compteur de caractères lus... enfin si ça marche c'est l'essentiel.

Reply

Marsh Posté le 08-01-2012 à 19:23:19    

Tout est réglé.
Merci beaucoup.
i est la taille du container
j est la taille de l'atom
s'il reste des datas non traitées à la fin
je transfère sans m'inquièter.
 

Code :
  1. E:\Sources\new>m4p file.m4p file.m4a
  2. feof: 0
  3. Execute ftyp for 28 bytes
  4. feof: 0
  5. Execute moov for 3143411 bytes
  6. Start sub_moov for 108 bytes
  7. moov -> mvhd for 100 bytes
  8. Fill for 100 bytes
  9. Start sub_moov for 2934129 bytes
  10. moov -> trak for 2934121 bytes
  11. Fill for 2934121 bytes
  12. Start sub_moov for 14715 bytes
  13. moov -> trak for 14707 bytes
  14. Fill for 14707 bytes
  15. Start sub_moov for 194459 bytes
  16. moov -> udta for 194451 bytes
  17. Fill for 194451 bytes
  18. feof: 0
  19. Execute mdat for 248254944 bytes
  20. E:\Sources\new>


 
Ouf!


Message édité par jlnh le 08-01-2012 à 20:12:45
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed