2016-12-13 7 views
0

ich dieses kleine Programm geschrieben, das eine Datei in binärer Form (Databases.db in diesem Beispiel) liest und kopiert seinen Inhalt in der cpydatabases.db ...NULL Erinnerungen Eintrag

Wenn ich den Debugger im fopen_s(&source, "Databases.db", "r"); laufen , die source ist immer NULL (während das Debuggen zeigt, dass der Speichereintrag immer Null, 0x000000000000 <NULL> ist).

Dieses Programm läuft in Visual Studio 2015.

#include <stdio.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include "dirent.h" 
#include <string.h> 
#include <sys/stat.h> 
#include <stdlib.h> 

#define BUFFSIZE 2048 
char ch, *readbuf; 
int nread, nwrit; 
FILE *source, *target; 

int main() 
{ 
    int returnv; 
    fopen_s(&source, "Databases.db", "r"); 

    if (source !== NULL) 
    { 
     fclose(source); 
     return (EXIT_FAILURE); 
    } 
    fopen_s(&target,"cpydatabases.db", "w"); 
    //check again 
    if (target == NULL) 
    { 
     fclose(target); 
     return(EXIT_FAILURE); 
    } 
    //setting the char that reads the binary 
    readbuf = (char *)malloc(BUFFSIZE* sizeof(char)); 

    if (readbuf == NULL) 
    { 
     fclose(source); 
     fclose(target); 
     return(EXIT_FAILURE); 
    } 

    while (1) 
    { 
     nread = fread((void *)readbuf, sizeof(char), BUFFSIZE, source) ; 
     // fwrite((void *)readbuf, sizeof(char), nread, target); 
     nwrit = fwrite((void *)readbuf, sizeof(char), nread, target); 
     if (nwrit < nread) 
     { 
      returnv = (EXIT_FAILURE); 
     } 
     if (nread <= BUFFSIZE) 
     { 
      returnv = (EXIT_SUCCESS); 
      break; 
     }  
    } 

    fclose(source); 
    fclose(target); 

    return 0; 
} 
+0

Was ist die Rückkehr von 'fopen_s' Funktionsaufrufen? Wenn 'source'' NULL' ist, müssen Sie 'close' nicht. – purplepsycho

+0

Überprüfen Sie das msdn-Beispiel für den Rückgabewert von fopen_s https://msdn.microsoft.com/en-us/library/z5hh6ee9.aspx – izlin

+1

Sind die Dateien im selben Ordner wie die ausführbare Datei? – Bauss

Antwort

0

Ich denke "Databases.db" ist nicht in demselben Verzeichnis, in dem ausführbar ist. Sie können den vollständigen Pfad von "Databases.db" angeben oder kopieren Sie diese Datei, wo Ihre .sln Datei ist.

+0

Ich habe die Datei in das gleiche Verzeichnis mit der .exe gelegt, aber immer noch das gleiche Problem – egoist

0

Das funktionierte für mich. Sie sollten Ihre Databases.db-Datei in demselben Ordner wie Ihrer source.cpp-Datei haben oder einen absoluten Pfad wie "C:/Databases" verwenden. Trotzdem funktionierte dieser Code für mich:

#define BUFFSIZE 2048 
char ch, source_file[50], target_file[50], *readbuf; 
int nread, nwrit; 

FILE *source, *target; 
int main() 
{ 

    int returnv; 
    fopen_s(&source, "Databases.db", "r"); 

    if (source == NULL) 
    { 
     //fclose(source); 
     return (EXIT_FAILURE); 
    } 
    fopen_s(&target, "cpydatabases.db", "w"); 
    //check again 
    if (target == NULL) 
    { 
     fclose(target); 
     return(EXIT_FAILURE); 
    } 
+0

Wahrscheinlich sollte '==', wie er es mit 'Ziel' tut. Aber die 'fclose' sollte nicht da sein. –

+0

Ja, ich sah das schließlich :) –

+0

meine "cpydatabases.db" ist nicht die gleiche Größe (7KB die Datenbanken, 2KB die cpydatabases) ... der Code funktioniert, aber ich kann nicht herausfinden, was schief geht in der & Quellspeicheradresse und Warum ist es Null – egoist

Verwandte Themen