problem mit FILE*(schreiben mag nicht)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • problem mit FILE*(schreiben mag nicht)

    so, ich bin auch ma wieder da mit einem problem...

    ich habe eine WAD-file (wiki.xentax.com/index.php?title=Lego_Rock_Raiders_WAD), und wollte mir ein programm schreiben, und die einzelnen daten auszulesen.
    mein programm is jetzt so nen mischmasch aus C und C++, aber das is ja letzendlich ziemlich egal
    auf jedenfall bekomm ich alles wunderbar eingelesen, nur wenn ich dann eine datei schreiben will, meckert er...

    C-Quellcode

    1. #include <iostream>
    2. #include <stdlib.h>
    3. using namespace std;
    4. struct wad_file
    5. {
    6. char name_rel[256];
    7. char name_abs[256];
    8. unsigned int version;
    9. unsigned int size;
    10. unsigned int offset;
    11. };
    12. int main(int argv, char *argc[])
    13. {
    14. FILE *wad;
    15. wad = fopen(argc[1], "rb");
    16. if(wad == NULL)
    17. {
    18. cout << "FAIL";
    19. for(;;);
    20. }
    21. char header[5] = {' ', ' ', ' ', ' ', '\0'};
    22. fread(&header, 1, 4, wad);
    23. if(!strcmp(header, "WWAD"))
    24. {
    25. cout << "WAD-File found!\n";
    26. }
    27. else
    28. {
    29. cout << "Wrong file-type!\n";
    30. for(;;);
    31. }
    32. wad_file file[3000];
    33. unsigned int size = 0;
    34. fread(&size, 4, 1, wad);
    35. cout << "Number of files: " << size << endl;
    36. cout << "\n ... start unpacking ... \n\n";
    37. for(unsigned int times = 0; times < size; times++)
    38. {
    39. int num = 0;
    40. do
    41. {
    42. file[times].name_rel[num] = fgetc(wad);
    43. } while(file[times].name_rel[num++] != 0x00);
    44. //cout << times << " " << file[times].name_rel << endl;
    45. }
    46. for(unsigned int times = 0; times < size; times++)
    47. {
    48. int num = 0;
    49. do
    50. {
    51. file[times].name_abs[num] = fgetc(wad);
    52. } while(file[times].name_abs[num++] != 0x00);
    53. //cout << file[times].name_abs << endl;
    54. }
    55. for(unsigned int times = 0; times < size; times++)
    56. {
    57. unsigned int size_f = 0, size_s = 0;
    58. fread(&file[times].version, 4, 1, wad);
    59. fread(&size_f, 4, 1, wad);
    60. fread(&size_s, 4, 1, wad);
    61. if(size_f != size_s)
    62. {
    63. cout << "File-size ERROR";
    64. for(;;);
    65. }
    66. file[times].size = size_f;
    67. fread(&file[times].offset, 4, 1, wad);
    68. }
    69. for(unsigned int times = 0; times < size; times++)
    70. {
    71. cout << file[times].name_rel << endl;
    72. cout << file[times].name_abs << endl;
    73. cout << file[times].version << endl;
    74. cout << file[times].size << endl;
    75. cout << file[times].offset << endl << endl;
    76. }
    77. for(unsigned int times = 0; times < size; times++)
    78. {
    79. rewind(wad);
    80. char j = 0;
    81. for(unsigned int h = 0; h < file[times].offset; h++)
    82. {
    83. fread(&j, 1, 1, wad);
    84. }
    85. FILE *output = NULL;
    86. output = fopen(file[times].name_rel, "wb");
    87. int tmp;
    88. cout << "Write " << file[times].name_rel << endl;
    89. for(unsigned int pos = 0; pos < file[times].size; pos++)
    90. {
    91. cout << "read...";
    92. tmp = fgetc(wad);
    93. cout << " ...write\n";
    94. fputc(tmp, output);
    95. }
    96. fclose(output);
    97. }
    98. fclose(wad);
    99. for(;;);
    100. return(0);
    101. }
    Alles anzeigen


    der fehler muss irgentwo in der letzen for-schleife liegen, also in der ich schreib.
    die erste datei funktioniert einwandfrei, aber bei der zweiten stürzt mein programm ab...
    sieht vllt jmd den fehler?

    (bitte nicht wegen der for(;;); meckern, die sollen nur verhindern das es einfach ausgeht)

    ich hab auch gleich mal ne wad datei verlinkt, weil das spiel wahrscheinlich keiner hat, von dem ich die dateien hab.

    blackshampoo.bl.ohost.de/LegoRR1.zip

    danke im vorraus
  • Hallo,

    Hast du das Programm mal durch den Debugger gejagt?

    ich sehe zwar in deinem Code keinen Fehler, aber ich schildere dir mal was ich so für Probleme hatte, wenn ich Files einlese...

    Stack ist voll. Der Stack hat je nach OS nur eine bestimmte Größe. (2-3MB).

    Ein weiteres Problem, war, das ich mir keinen Buffer gebaut habe. Also habe ich angefangen die Files nicht mehr regulär zu öffnen sonder zu streamen. Um das zu realisieren könntest du zB. boost.org verwenden.
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.