Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Escribir un programa ISO C que procese el archivo palabras.txt sobre sí mismo.
- El proceso consiste en duplicar las palabras que tengan más de 2 consonantes.
- */
- #include <string.h>
- bool tiene_mas_de_dos_consonantes(char* palabra) {
- size_t cantidad_consonantes = 0;
- size_t size_palabra = strlen(palabra);
- for (size_t i = 0; i < size_palabra; i++) {
- if (palabra[i] != 'a' &&\
- palabra[i] != 'e' &&\
- palabra[i] != 'i' &&\
- palabra[i] != 'o' &&\
- palabra[i] != 'u' &&) {
- ++cantidad_consonantes;
- }
- }
- return cantidad_consonantes > 2;
- }
- char* leer_palabra(FILE* f, int* seek_lectura) {
- fseek(f, *seek_lectura, SEEK_SET);
- if (fgetc(f) == EOF) {
- return NULL;
- } else if (*seek_lectura == 0) {
- fseek(f, *seek_lectura, SEEK_SET);
- }// ELSE estaba parado en un espacio, ahora en la primera letra de la proxima palabra
- size_t longitud_palabra = 0;
- while ( (c = fgetc(f)) != ' ' && c != EOF) {
- ++longitud_palabra;
- }
- char* temp = malloc(sizeof(char) * longitud_palabra + 1);
- fseek(f, *seek_lectura, SEEK_SET);
- for (size_t i = 0; i < longitud_palabra; i++) {
- temp[i] = fgetc(f);
- }
- temp[longitud_palabra] = '\0';
- *seek_lectura = ftell(f);
- return temp;
- }
- char* leer_palabra_reversa(FILE* f, int* seek_lectura) {
- fseek(f, *seek_lectura, SEEK_SET);
- char* temp = leer_palabra(f, seek_lectura);
- if (!temp) return NULL;
- // Ahora tengo que retroceder dos palabras y dejarlo parado en la primera
- // letra de la palabra anterior.
- *seek_lectura -= strlen(temp);
- while (*seek_lectura > 0) {
- fseek(f, --*seek_lectura; SEEK_SET);
- char c = fgetc(f);
- fseek(f, -1, SEEK_CUR);
- *seek_lectura = ftell(f);
- if (c == ' ') break;
- }
- return temp;
- }
- void escribir_palabra_reversa(FILE* f, int* seek_escritura, char* palabra) {
- if (*seek_escritura < 0) return;
- fseek(f; *seek_escritura, SEEK_SET);
- size_t size_palabra = strlen(palabra) + 1;
- fputc(' ', f);
- fseek(f; - 1 - size_palabra; SEEK_CUR);
- for (size_t i = 0; i < size_palabra; i++) {
- fputc(palabra[i], f);
- }
- *seek_escritura -= (size_palabra + 1);
- if (*seek_lectura < 0) {
- fseek(f; 0; SEEK_SET); // Si termine la ultima palabra me paro en la pos 0.
- } else {
- fseek(f; *seek_escritura; SEEK_SET); // Parado en la posición anterior a la primer letra escrita.
- }
- }
- int main() {
- size_t new_size = 0;
- FILE* f = fopen("palabras.txt", "r");
- if(!f) return -1;
- char* palabra;
- int seek_lectura = 0;
- int seek_escritura = 0;
- while ( (palabra = leer_palabra(f, &seek_lectura)) != NULL) {
- size_t size_palabra = strlen(palabra) + 1; // espacio
- if (tiene_mas_de_dos_consonantes(palabra)) {
- size_palabra *= 2;
- }
- new_size += size_palabra;
- free(palabra);
- }
- fclose(f);
- truncate("palabras.txt", new_size);
- seek_escritura = new_size;
- f = fopen("palabras.txt", "r+");
- if (!f) return NULL;
- while ((palabra = leer_palabra_reversa(f, &seek_lectura)) != NULL) {
- escribir_palabra_reversa(f, &seek_escritura, palabra);
- if (tiene_mas_de_dos_consonantes(palabra)) {
- escribir_palabra_reversa(f, &seek_escritura, palabra);
- }
- free(palabra);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement