Advertisement
tomasaccini

Untitled

Jul 16th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.47 KB | None | 0 0
  1.  
  2. /*
  3. Escribir un programa ISO C que procese el archivo palabras.txt sobre sí mismo.
  4. El proceso consiste en duplicar las palabras que tengan más de 2 consonantes.
  5. */
  6.  
  7. #include <string.h>
  8.  
  9. bool tiene_mas_de_dos_consonantes(char* palabra) {
  10.     size_t cantidad_consonantes = 0;
  11.     size_t size_palabra = strlen(palabra);
  12.     for (size_t i = 0; i < size_palabra; i++) {
  13.         if (palabra[i] != 'a' &&\
  14.             palabra[i] != 'e' &&\
  15.             palabra[i] != 'i' &&\
  16.             palabra[i] != 'o' &&\
  17.             palabra[i] != 'u' &&) {
  18.             ++cantidad_consonantes;
  19.         }
  20.     }
  21.     return cantidad_consonantes > 2;
  22. }
  23.  
  24. char* leer_palabra(FILE* f, int* seek_lectura) {
  25.     fseek(f, *seek_lectura, SEEK_SET);
  26.     if (fgetc(f) == EOF) {
  27.         return NULL;
  28.     } else if (*seek_lectura == 0) {
  29.         fseek(f, *seek_lectura, SEEK_SET);
  30.     }// ELSE estaba parado en un espacio, ahora en la primera letra de la proxima palabra
  31.     size_t longitud_palabra = 0;
  32.     while ( (c = fgetc(f)) != ' ' && c != EOF) {
  33.         ++longitud_palabra;
  34.     }
  35.     char* temp = malloc(sizeof(char) * longitud_palabra + 1);
  36.     fseek(f, *seek_lectura, SEEK_SET);
  37.     for (size_t i = 0; i < longitud_palabra; i++) {
  38.         temp[i] = fgetc(f);
  39.     }
  40.     temp[longitud_palabra] = '\0';
  41.     *seek_lectura = ftell(f);
  42.     return temp;
  43. }
  44.  
  45. char* leer_palabra_reversa(FILE* f, int* seek_lectura) {
  46.     fseek(f, *seek_lectura, SEEK_SET);
  47.     char* temp = leer_palabra(f, seek_lectura);
  48.     if (!temp) return NULL;
  49.     // Ahora tengo que retroceder dos palabras y dejarlo parado en la primera
  50.     // letra de la palabra anterior.
  51.     *seek_lectura -= strlen(temp);
  52.     while (*seek_lectura > 0) {
  53.         fseek(f, --*seek_lectura; SEEK_SET);
  54.         char c = fgetc(f);
  55.         fseek(f, -1, SEEK_CUR);
  56.         *seek_lectura = ftell(f);
  57.         if (c == ' ') break;
  58.     }
  59.     return temp;
  60. }
  61.  
  62. void escribir_palabra_reversa(FILE* f, int* seek_escritura, char* palabra) {
  63.     if (*seek_escritura < 0) return;
  64.     fseek(f; *seek_escritura, SEEK_SET);
  65.     size_t size_palabra = strlen(palabra) + 1;
  66.     fputc(' ', f);
  67.     fseek(f; - 1 - size_palabra; SEEK_CUR);
  68.     for (size_t i = 0; i < size_palabra; i++) {
  69.         fputc(palabra[i], f);
  70.     }
  71.     *seek_escritura -= (size_palabra + 1);
  72.     if (*seek_lectura < 0) {
  73.         fseek(f; 0; SEEK_SET); // Si termine la ultima palabra me paro en la pos 0.
  74.        
  75.     } else {
  76.         fseek(f; *seek_escritura; SEEK_SET); // Parado en la posición anterior a la primer letra escrita.
  77.     }
  78. }
  79.  
  80. int main() {
  81.     size_t new_size = 0;
  82.     FILE* f = fopen("palabras.txt", "r");
  83.     if(!f) return -1;
  84.     char* palabra;
  85.     int seek_lectura = 0;
  86.     int seek_escritura = 0;
  87.    
  88.     while ( (palabra = leer_palabra(f, &seek_lectura)) != NULL) {
  89.         size_t size_palabra = strlen(palabra) + 1; // espacio
  90.         if (tiene_mas_de_dos_consonantes(palabra)) {
  91.             size_palabra *= 2;
  92.         }
  93.         new_size += size_palabra;
  94.         free(palabra);
  95.     }
  96.     fclose(f);
  97.     truncate("palabras.txt", new_size);
  98.  
  99.     seek_escritura = new_size;
  100.  
  101.     f = fopen("palabras.txt", "r+");
  102.     if (!f) return NULL;
  103.  
  104.     while ((palabra = leer_palabra_reversa(f, &seek_lectura)) != NULL) {
  105.         escribir_palabra_reversa(f, &seek_escritura, palabra);
  106.         if (tiene_mas_de_dos_consonantes(palabra)) {
  107.             escribir_palabra_reversa(f, &seek_escritura, palabra);
  108.         }
  109.         free(palabra);
  110.     }
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement