私は順序付けられた一連の数字を取得しようとしています (私が投稿しているコードは私が使用するアプローチではありませんが、コードで行われた出力をバイナリ ファイルに書き込む必要があります)。
「ordenar」の最後の反復を除いて、すべて正常に動作します。注文後に数字を再度出力すると、最後の行を除いてすべてが注文され、ordenar が正しく行われていることを確認しました。fwrite()
最後の反復では値 10 を返しますが、最後の出力が書き込まれていないように見えます。
コードは次のとおりです。
#define _CRT_SECURE_NO_DEPRECATE
#define SIZE 10
#define MAX 10
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int numbers[SIZE];
int genera_numeros() {
unsigned long i, j;
FILE *file;
file = fopen("number.dat", "wb");
if (!file) {
perror("fopen");
return 1;
}
srand(time(0));
for (i = 0; i < MAX; i++) {
for (j = 0; j < SIZE; j++) {
numbers[j] = rand()%1000;
printf("%i ", numbers[j]);
}
fwrite(numbers, sizeof(int), SIZE, file);
printf("\n");
}
fclose(file);
return 0;
}
int imprime_numeros() {
unsigned long i, j;
int numbers[SIZE];
FILE *file;
file = fopen("number.dat", "rb");
if (!file) {
perror("fopen");
return 1;
}
for (i = 0; i < MAX; i++) {
fread(numbers, sizeof(int), SIZE, file);
for (j = 0; j < SIZE; j++) {
printf("%i ",numbers[j]);
}
printf("\n");
}
fclose(file);
return 0;
}
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int ordenar(FILE* file, long int num_bloque)
{
int byte=0, written=0;
fseek(file, num_bloque * sizeof(int) * SIZE, SEEK_SET);
fread(numbers, sizeof(int), SIZE, file);
qsort (numbers, SIZE, sizeof(int), compare);
fseek(file, num_bloque * sizeof(int) * SIZE, SEEK_SET);
byte=ftell(file);
written=fwrite(numbers, sizeof(int), SIZE, file);
return 0;
}
int main(int argc, char* argv[]) {
FILE *file;
file = fopen("number.dat", "rb+");
long int i;
genera_numeros();
printf("\n\n Los numeros son:\n\n");
imprime_numeros();
printf("\n\n Ordenando...");
for (i=0; i<MAX; i++)
{
ordenar(file, i);
}
printf("\n\n Los numeros son:\n\n");
imprime_numeros();
printf("\n");
fclose(file);
system("PAUSE");
return 0;
}