0

El código es en C++ y al recibir como dato el archivo de texto arc.txt compuesto por cadenas de caracteres en las que puede aparecer la palabra méxico escrita con minúsculas, cada vez que localice la palabra méxico en una cadena, la reemplace por su forma correcta —la primera letra con mayúsculas (México)— y escriba la nueva cadena en el archivo arc1.txt.

#include <stdio.h>
void sust_a(void)
{
    FILE *arch;
    char car; 
    arch=fopen("arc.txt","r+");       //mando a pedir el txt 
    while (fscanf(arch,"%c",&car)!=EOF)
    {
        if (car=='mexico')     //aqui es donde me marca el error, id returned 1 exit status
        {
            fprintf(arch,"Mexico");    
        }
    }
    fclose(arch);
}
padaleiana
  • 2,175
  • 5
  • 16
  • 24
  • Hola Erick, ¿C++ o C?, porque no son lo mismo y eso en principio es C aunque este código pueda ser compatible con C++ – FJSevilla Mar 08 '20 at 18:10
  • `car` está definido como un carácter, nunca podrá tomar el valor `'mexico'` – 4lrdyD Mar 08 '20 at 20:10
  • ¿ Podrias modificar el título para indicar **exactamente** el error/aviso que estás recibiendo ? Así será más fácil para los que puedan ayudarte. – Trauma Mar 08 '20 at 20:24

2 Answers2

1

Para trabajar la lectura y escritura de archivos, suponiendo que lo haces en C++, deberías usar la librería fstream, usando string::find para encontrar la palabra deseada dentro de cada línea y string::replace para reemplazarla si fue encontrada (ver este post, está en ingles). Conjuntamente con la librería string, una posible solución a lo que deseas sería:

#include<fstream>
#include<iostream>
using std::cout;
#include<string>
using std::string;

void sust_a(void){
    string reemp = "méxico";
    string reemp_con = "México";
    string line;
    size_t len = reemp.length();

    std::ifstream archivo_in{ "arc.txt" };//archivo de entrada
    std::ofstream archivo_out{ "arc1.txt" };//archivo de salida

    if (archivo_in && archivo_out) {//si los archivos fueron abiertos correctamente dara true
        while (getline(archivo_in, line)){//lee una línea
            while (true){
                size_t pos = line.find(reemp);//busca méxico en la línea actual
                if (pos != string::npos)
                    line.replace(pos, len, reemp_con);//si la encuentra la reemplaza con México
                else
                    break;
            }
            archivo_out << line << '\n';//aqui escribe la línea corregida en el nuevo archivo
        }
    }
    else
        cout << "No se pueden abrir los archivos";
}
4lrdyD
  • 492
  • 4
  • 10
  • 1
    ¡Tu propuesta está muy bien! Pero tiene mucho espacio para mejora: no necesitas dos archivos, puedes trabajar sobre el mismo. Cuanto más pequeño sea el ámbito de los `using`, mejor, su sitio ideal sería dentro de la función. No necesitas leer línea a línea si lo que buscas es una palabra concreta. – PaperBirdMaster Mar 09 '20 at 08:17
  • Perdón, acabo de ver que **en el título** indica que quiere trabajar con dos archivos, pero **en el código** sólo trabaja con uno. – PaperBirdMaster Mar 09 '20 at 08:19
  • Gracias por compartir esos detalles a mejorar @PaperBirdMaster, tu propuesta es más práctica. – 4lrdyD Mar 09 '20 at 15:32
1

En un primer vistazo, ya se ven al menos tres errores en tu código:

  1. La pregunta está etiquetada como pero el código es absolutamente .
  2. La cabecera <stdio.h> es de C y no debe ser usada en código C++, si es necesario usarla (casi nunca lo es) debe usarse la versión adaptada a C++: <cstdio>. Lee este hilo para saber más.
  3. Usas un literal multibyte en lugar de una cadena para comprobar el valor de un carácter… aunque no lo parezca 'mexico' es un número (no una cadena de caracteres) cuyo valor es dependiente de la implementación del compilador1, pero sea cual sea el valor nunca será el valor de un carácter como car.

Mientras escribía vi dos errores más:

  1. Un carácter no es una palabra, 'm' nunca será "mexico".
  2. Una vez leído un carácter, el puntero de lectura está en el siguiente carácter, por lo que aún suponiendo que leyeses la palabra "mexico" si escribes "Mexico" en la posición de lectura, obtendrás "mMexico".

Suponiendo que realmente quisieras programar en C++ (que no lo parece) tu código debería parecerse a:

// Abrir archivo arc.txt
if (std::fstream arc{"arc.txt"})
{
    // Leer palabra por palabra.
    for (std::string palabra; arc; arc >> palabra)
    {
        // Si la palabra leída es "mexico"
        if (palabra == "mexico")
        {
            // Rebobina seis caracteres.
            arc.seekg(arc.tellg() - 6l);
            // Escribe "Mexico".
            arc << "Mexico";
        }
    }
} // El archivo se cierra aquí automáticamente.

Puedes ver el código funcionando en Try it online!.


1Podría ser un número cuya representación binaria tuviera el valor del carácter 'm' en el byte de mas peso y el valor de 'o' en el de menos: 6d657869636f16 o 12028257929713510.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82