我只是試圖獲得一組數字(而我發佈的代碼不是我要使用的方法,我確實需要寫入二進制文件輸出在代碼中完成)。
一切工作正常,除了「ordenar」的最後一次迭代:當我在訂購後再次打印數字時,除了最後一行之外,所有東西都是有序的,我已驗證ordenar是否正確完成,並且在那最後一次迭代返回值爲10,但看起來好像它不寫入最後一次輸出。fwrite在最後一次迭代中不工作
代碼是:
#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;
}
您可以在開始時打開文件,然後在'genera'和'imprime'期間打開/關閉它。我很確定這是一個壞主意。如果您在'main'程序中打開'file'並等待排序循環之前會發生什麼? – Floris
沒有運氣。 –
你應該避免發佈大塊代碼。總是試着準備[簡短,獨立,正確,例子](http://www.sscce.org/) – zero323