Проблема при записи и чтении в двоичный файл

Я пытаюсь создать синтетический dataset (значения между 0-1) и сохранить их в двоичном файле. Ниже приведен мой код:

int n = 4000, dim = 4,i,j; FILE *fp=fopen("dataset.data", "w+"); double *data = (double *) calloc(n * dim, sizeof(double)); double *data_to_read = (double *) calloc(n * dim, sizeof(double)); // Generate dataset srand(1); for (i = 0; i < (n * dim); ++i) { data[i] = (float) rand() / (float) RAND_MAX; } // Writing to binary file if (fp) fwrite(data, 1, (n*dim) * sizeof(double), fp); else { printf("Something went wrong while writing to File !! \n"); } // To make sure data have been written, read and print out the file. fp = fopen("Home/dataset.data", "rb"); fread(data_to_read, 1, (n*dim) * sizeof(double), fp); fclose(fp); for (i = 0; i < n; ++i) { printf("[%d] ", i); for (j = 0; j < dim; ++j) { printf("%f, ", data_to_read[i * dim + j]); } printf("\n"); } 

Тем не менее, я получаю много нhive в конце печати, что заставляет меня думать, что что-то не так. Что-то вроде этого:

 [3962] 0.519062, 0.877532, 0.686047, 0.396526, [3963] 0.419497, 0.494090, 0.163209, 0.061352, [3964] 0.144232, 0.113827, 0.082452, 0.777153, [3965] 0.609784, 0.647998, 0.902744, 0.414265, [3966] 0.543551, 0.462175, 0.775620, 0.842364, [3967] 0.607382, 0.274029, 0.599672, 0.682604, [3968] 0.000000, 0.000000, 0.000000, 0.000000, [3969] 0.000000, 0.000000, 0.000000, 0.000000, [3970] 0.000000, 0.000000, 0.000000, 0.000000, [3971] 0.000000, 0.000000, 0.000000, 0.000000, [3972] 0.000000, 0.000000, 0.000000, 0.000000, [3973] 0.000000, 0.000000, 0.000000, 0.000000, [3974] 0.000000, 0.000000, 0.000000, 0.000000, [3975] 0.000000, 0.000000, 0.000000, 0.000000, [3976] 0.000000, 0.000000, 0.000000, 0.000000, [3977] 0.000000, 0.000000, 0.000000, 0.000000, [3978] 0.000000, 0.000000, 0.000000, 0.000000, [3979] 0.000000, 0.000000, 0.000000, 0.000000, [3980] 0.000000, 0.000000, 0.000000, 0.000000, [3981] 0.000000, 0.000000, 0.000000, 0.000000, [3982] 0.000000, 0.000000, 0.000000, 0.000000, [3983] 0.000000, 0.000000, 0.000000, 0.000000, [3984] 0.000000, 0.000000, 0.000000, 0.000000, [3985] 0.000000, 0.000000, 0.000000, 0.000000, [3986] 0.000000, 0.000000, 0.000000, 0.000000, [3987] 0.000000, 0.000000, 0.000000, 0.000000, [3988] 0.000000, 0.000000, 0.000000, 0.000000, [3989] 0.000000, 0.000000, 0.000000, 0.000000, [3990] 0.000000, 0.000000, 0.000000, 0.000000, [3991] 0.000000, 0.000000, 0.000000, 0.000000, [3992] 0.000000, 0.000000, 0.000000, 0.000000, [3993] 0.000000, 0.000000, 0.000000, 0.000000, [3994] 0.000000, 0.000000, 0.000000, 0.000000, [3995] 0.000000, 0.000000, 0.000000, 0.000000, [3996] 0.000000, 0.000000, 0.000000, 0.000000, [3997] 0.000000, 0.000000, 0.000000, 0.000000, [3998] 0.000000, 0.000000, 0.000000, 0.000000, [3999] 0.000000, 0.000000, 0.000000, 0.000000, 

Я не знаю, правилен ли мой способ письма. Любая помощь может быть применена.

В вашем коде есть несколько проблем:

  • Вы не fclose файл, как только вы его написали.
  • Вы не проверяете все fopen s, если они преуспели.
  • Вам нужно открыть файл с помощью «wb», а не «w +».
  • Вы не читаете тот же файл, который вы пишете.
  • Если файл не может быть открыт для записи, вы увидите сообщение об ошибке, но вы по-прежнему продолжаете пытаться прочитать из файла, который вы не могли открыть

Исправленная программа (включая исправление бессмысленных комментариев и сомнительных сообщений об ошибках), комментарии с «мои»:

 #include  #include  #include  int main() { int n = 4000, dim = 4, i, j; FILE *fp = fopen("dataset.data", "wb"); // << wee need "wb" here double *data = calloc(n * dim, sizeof(double)); // << no casts in C double *data_to_read = calloc(n * dim, sizeof(double)); // Generate dataset srand(1); for (i = 0; i < (n * dim); ++i) { data[i] = (float)rand() / (float)RAND_MAX; } // Writing to binary file if (fp) fwrite(data, 1, (n*dim) * sizeof(double), fp); else { printf("Something went wrong while opening the file to write !! \n"); return 1; // << abort of file could not be opened } fclose(fp); // << closing file // Read and print out the file. fp = fopen("dataset.data", "rb"); // << opening the same file than the one we wrote to if (fp) // << checking if file could be opened { fread(data_to_read, 1, (n*dim) * sizeof(double), fp); fclose(fp); for (i = 0; i < n; ++i) { printf("[%d] ", i); for (j = 0; j < dim; ++j) { printf("%f, ", data_to_read[i * dim + j]); } printf("\n"); } } else { printf("Something went wrong while opening the file to read!! \n"); return 1; } // << check if read data is equal to written data if (memcmp(data_to_read, data, n*dim) == 0) { printf("\nRead data is equal to written data\n"); } return 0; } 

Отказ от ответственности: могут быть и другие ошибки, которых я не заметил.

Думаю, я заметил вашу проблему:

Вы пишете этот файл:

 FILE *fp=fopen("dataset.data", "w+"); 

Но вы читаете этот файл:

 fp = fopen("Home/dataset.data", "rb"); 

Вы не читаете файл, который пишете.

Откройте файл таким образом:

 FILE *fp = fopen("dataset.data", "wb+"); 

Затем, после записи данных с помощью fwrite, закройте указатель файла или сбросьте его:

 fclose(fp); //alternatively: // fflush(fp); // fseek(fp, 0, SEEK_SET); 

Наконец, исправьте путь второго fopen