У меня есть эта программа в C, что упорядочивает 100000 случайных чисел посредством алгоритма Мерхе Сорт, но не делает мне распоряжение и не пишет в файле resultado2.txt. Файл resultado3.txt это 100000 случайных чисел. Они могли бы помогать мне видеть мои ошибки и возможные решения, заранее, большое спасибо. Следующий код - main программы, после main приходит функция алгоритма Мерхе Сорт.
#include <stdlib.h>
#include <stdio.h>
void ordenarPorMezcla(int posIzq, int arregloNumeros[], int posDer);
int main(){
int i;
char ofilename[] = "resultado2.txt";
FILE *archivo;
if((archivo = fopen(ofilename, "w"))==NULL){
printf("Error en apertura de archivo");
}
FILE * flujo=fopen("resultado3.txt", "r");
if(flujo == NULL){
perror("error en la apertura del archivo");
return 1;
}
fseek(flujo, 0, SEEK_SET);
int numerodeele = ftell(flujo);
rewind(flujo);
int * arregloNumeros = (int*) calloc(sizeof(int), numerodeele);
if(arregloNumeros == NULL){
perror("error en la reserva de memoria");
return 2;
}
int num_elementos_leidos = fread(arregloNumeros,sizeof(int), numerodeele, flujo);
if(num_elementos_leidos != numerodeele) {
perror("Error leyendo el archivo");
return 3;
}
free(arregloNumeros);
fclose(flujo);
// ordenamos por mezcla
ordenarPorMezcla(0, arregloNumeros, 100001-1);
// imprimimos el arreglo ordenado
printf("arreglo ordenado");
for( i=0; i<100001; i++)
fprintf(archivo,"%d\n ", arregloNumeros[i]);
printf("\n");
// Hacemos una pausa para que el programa no se cierre
system("pause");
// Finalizamos el programa principal
return EXIT_SUCCESS;
} // fin del main
Я не добавлю функцию алгоритма, чтобы не занимать так место.
FГ-jate в этом cГіdigo:
FILE * flujo=fopen("resultado3.txt", "r");
fseek(flujo, 0, SEEK_SET);
int numerodeele = ftell(flujo);
rewind(flujo);
Делает следующее:
А именно, три Гєltimas lГ-neas этого алгоритма podrГ-an упрощать asГ-:
int numerodeele = 0;
Я Понимаю, что с этим алгоритмом estГЎs, пробуя считать cuГЎntos nГєmeros, у него есть файл и жалоба сообщать тебе, что поэтому vГ - в, из-за многого, который ты попробовал, ты не будешь получать.
, Чтобы начинаться, потому что файл, независимо, если Ваш контент находится в бинарном способе или способе тексте, не будет предназначать один байт в каждый nГєmero:
sizeof(int)
байт из-за каждый nГєmero Adicionalmente нужно иметь в виду, что fseek
не функционирует во всех случаях. Как он показывается в ней documentaciГіn:
For streams open in text mode, офсет shall either be zero or в value returned by в previous call to ftell, and origin shall necessarily be SEEK_SET.
А именно:
Для streams отверстий в способе текст, офсет deberГЎ быть 0 или стоимостью, возвращенной призывом, предварительным
ftell
origin deberГЎ, его быть обязательноSEEK_SET
Обобщая, твоя идея - posicionarte в конце файла, но ты не можешь использовать SEEK_END
, так как это не один operaciГіn вынесенная в способе текст . AdemГЎs нужен иметь в виду, что эта posiciГіn не ты servirГ - в абсолютно ни для чего.
ВїCГіmo мы можем делать это тогда?
Одна opciГіn происходит, из-за того, что два раза читают файл:
, Поскольку мы прокомментировали, способ знать cuГЎntos nГєmeros есть состоит в том, чтобы считать группирования dГ-gitos:
int c;
int grupoDigitos = 0;
int numerodeele = 0;
while( (c = fgetc(flujo)) != EOF )
{
if( isdigit(c) )
{
grupoDigitos = 1;
}
else
{
numerodeele += enNumero;
grupoDigitos = 0;
}
}
fseek(flujo, 0, SEEK_SET);
Чтение nГєmeros tambiГ©n, кажется, имеет проблемы и мотив - что они estГЎs читая как будто они были в бинарном . Это не то же самое иметь один nГєmero в бинарном (что ocuparГЎ обычно 4 байт), чтобы иметь в способе текст (то, что является читабельным из-за человека comГєn), в случае которого каждый nГєmero ocuparГЎ один nГєmero различный байт. Если ты будешь использовать механизмы чтения на низком уровне, тебе касается
перерабатывать nГєmero начиная с Ваш representaciГіn, а именно, ты берешь первый характер, это превращаешь в один dГ-gito numГ©rico, и если есть mГЎs символы, умножаешь результат на 10 и повторяешь процесс... ясно, что tambiГ©n ты можешь использовать fscanf
:
for( int i=0; i<numerodeele; i++ )
{
fscanf (flujo, "%d", &arregloNumeros[i]);
}