Ошибка в программе распоряжения с алгоритмом Мерхе Сорт в языке C

У меня есть эта программа в 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

Я не добавлю функцию алгоритма, чтобы не занимать так место.

0
задан 21.03.2019, 04:47
1 ответ

FГ-jate в этом cГіdigo:

FILE * flujo=fopen("resultado3.txt", "r");
fseek(flujo, 0, SEEK_SET);
int numerodeele = ftell(flujo);
rewind(flujo);

Делает следующее:

  1. Ты Открываешь файл. Когда открывает внутренний указатель apuntarГЎ в начало файла
  2. Ты posicionas в начало файла, а именно, ты не делаешь совсем не , так как указатель поместил уже, он находился в этой posiciГіn.
  3. Ты Читаешь... ВїLa posiciГіn внутреннего указателя? будешь являться нулем.
  4. Posicionas внутренний указатель файла в начало того же самого (...)

А именно, три Гєltimas lГ-neas этого алгоритма podrГ-an упрощать asГ-:

int numerodeele = 0;

Я Понимаю, что с этим алгоритмом estГЎs, пробуя считать cuГЎntos nГєmeros, у него есть файл и жалоба сообщать тебе, что поэтому vГ - в, из-за многого, который ты попробовал, ты не будешь получать.

, Чтобы начинаться, потому что файл, независимо, если Ваш контент находится в бинарном способе или способе тексте, не будет предназначать один байт в каждый nГєmero:

  • , Если находят в бинарном способе usarГЎn sizeof(int) байт из-за каждый nГєmero
  • , Если находит в способе текст usarГЎ один байт из-за каждый dГ-gito каждый nГєmero mГЎs по крайней мере другой, чтобы отделять два nГєmeros (я прыгаю lГ-nea, он раздвинул, запятая...)

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. Это operaciГіn может быть такой простой как считать nГєmero разделителей, хотя обычно mГЎs безопасно рассказывать все группы dГ-gitos, что ты находишься.
  • Во вторая перемещенная ты ограничиваешься тем, чтобы прочитать их nГєmeros.

, Поскольку мы прокомментировали, способ знать 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]);
}
1
ответ дан 02.12.2019, 05:21

Теги

Похожие вопросы