Duda en programa en C / Linux

Iniciado por ProN00b, 16 Noviembre 2013, 16:52 PM

0 Miembros y 1 Visitante están viendo este tema.

ProN00b

tengo este codigo, http://paste.ofcode.org/39b3fLgxWkAUxjYwqjchDQU Lo pongo ahi para no hacer el post largo.. me falta hacer que ordene el archivo que ponga por consola en LINUX. El programa deberia, en terminal, que yo escriba

suponiendo que mi programa se llama sort1...

./sort1 myfile.txt

Y si mi archivo de texto tiene 2143 me salga 1234, si tiene Hola 2 como 1 estas 3
Me salga 123 como estas Hola, ordenado... La cosa es que al passar el archivo por consola, no me muestra nada, y no se.. me pueden ayudar?

Y otra duda, como puedo hacer para que en la linea de comandos en Linux/Ubuntu Pueda concatenar N cantidad de archivos pasados por el argumento del main? por ejemplo 3 archivos, concatenarlos y ordenarlos?

rir3760

Con todo respeto el programa que mencionas no tiene relación alguna con lo que pides.

Si la intención es crear una versión básica del programa sort los pasos que debe realizar tu programa son:
1) Leer cada una de las lineas de la entrada estándar o el archivo indicado almacenando cada una en un bloque de memoria con el tamaño justo para ella.
2) Ordenar las lineas mediante la función qsort (prototipo en <stdlib.h>) o una propia.
3) Enviar todas las lineas ordenadas a la salida estándar (o el archivo indicado).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ProN00b

Gracias rir3760 pero como hago lo primero? que me dijiste lo de la 1) ?

La cosa suena facil, pero no es tan asi, mira te explico..

Este es el planteamiento de lo que me han mandado a hacer.

Se tiene que hacer su propio modelo del comando sort en Linux, que ordena las líneas de un archivo de texto, el cual se llamará ordenar. La forma de invocar el comando a travez de la consola, será asi.
Ordenar (opciones) ... (archivo.txt) ... (Pueden ser varios archivos o varias opciones)
El cual escribe por pantalla la ordenación de la concatenación de todos los archivos especificados.
Las opciones que tiene que implementar son :
-b : Ignora espacios en blanco
-f : ignora mayúsculas y minusculas
-I : No imprime caracteres especiales
-o, --output=File : Escribe el resultado del ordenamiento en File en vez de la salida estandar
-r : ordena al revez
--help : Muestra una ayuda sencilla
--version : Muestra la versión del programa
Se tiene que desarrollar en lenguaje C, para ejecutarse desde Linux/Debian

ProN00b

Este es mi nuevo codigo.

#include <stdlib.h>
#include <stdio.h>

#define CR 13 //caracter
#define LF 10 //Fin de linea


void cambia_caracter(char **xp, char **yp) {
  char *temp;

  temp = *xp;
  *xp = *yp;
  *yp = temp;
}


void ordena_string (char *s[], int len)
{
  int i,k; /* indice del vector y contador */
  char swaps=1; /* variable booleana: true si se produjo un swaps */

  for (k=1; k<=len-1 && swaps; k++) {
  swaps=0;
  for (i=0; i<len-k; i++)
  if (strcmp(s[i],s[i+1])>0) {
      /* cambia */
      cambia_caracter(&s[i], &s[i+1]);
      swaps=1;
  }
  }
}

int main(int argc, char** argv) {
   
char *inputFileName, *outputFileName;
FILE *inputFilePtr, *outputFilePtr;
char c;
char end_line;

/* inicializa, precaución */
inputFilePtr = NULL;
outputFilePtr = NULL;

if (argc < 2) {
printf("Error: falta nombre de archivo a procesar\n");
return -1;
}

inputFileName = argv[1];
if ((inputFilePtr = fopen(inputFileName, "r+")) == NULL) {
printf("Error: no se pudo abrir (o no existe) el archivo '%s'\n", inputFileName);
return -1;
}

/* Si especificó destino de salida */
if (argc >= 3) {
outputFileName = argv[2];
if ((outputFilePtr = fopen(outputFileName, "w")) == NULL) {
printf("Error: no se pudo abrir (o no existe) el archivo '%s'\n", outputFileName);
return -1;
}
}
else
outputFilePtr = stdout; /* salida estándar */

/* Ahora imprime contenido a salida apuntada por outFilePtr
   Nota: cuando se lee CR o LF (fin de linea) se activa la bandera end_line, la cual sólo
   se desactiva cuando no se lee ni CR ni LF. Mientras end_line == 1, no se imprimen
   caracteres a la salida.
*/
end_line = 0;
while ((c = fgetc(inputFilePtr)) != EOF) {

if ((c == CR || c == LF) && !end_line) { /* fin de linea */
fprintf(outputFilePtr, "\n");
end_line = 1;
}

if (end_line && c != CR && c != LF)
end_line = 0;

if ( !end_line ) /* si no fin de linea, imprimir el caracter */
fputc(c, outputFilePtr);
}

/* Cierra archivos abiertos (si fueron abiertos serán no-NULL) */
if (inputFilePtr != NULL) fclose(inputFilePtr);
if (outputFilePtr != NULL) fclose(outputFilePtr);

return 0;
}


Lo que ahora no entiendo es mocidifcar mi codigo, para que cuando entre en el archivo, me guarde todo el conenido en un buffer o un arreglo de caracteres, para luego poder ordenarlo con las funciones que agregue... alguien podria editarlo porfavor? estoy urgido!

rir3760

El programa lo debes rescribir desde cero empezando por la lectura de las lineas del archivo. Empieza con el caso mas sencillo asumiendo que nunca habrá mas de N lineas y ninguna de ellas tendrá mas de M caracteres.

Los pasos son:

1) Abres el archivo (función fopen).

2) Mediante un bucle:
2.1) Lees una linea en un array auxiliar (función fgets).
2.2) Obtienes su longitud y descartas el avance de linea (función strlen).
2.3) Reservas un bloque de memoria del tamaño justo (función malloc).
2.4) Copias en el bloque la linea (función strcpy).

3) Cierras el archivo.

El siguiente paso es ordenar las lineas (función sort) e imprimirlas mediante un bucle con printf (salida estándar) o fprintf (si la salida es un archivo).

Puedes revisar temas con ejemplos de esas funciones, para ello solo tienes que utilizar el motor de búsqueda de los foros.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language