Olha essa.. caso do Trocastring

9 views
Skip to first unread message

angelo

unread,
Jun 2, 2026, 11:07:14 AM (yesterday) Jun 2
to ccppb...@googlegroups.com
Boa tarde, srs,

Eu que nunca posto nada.. dessa vez vou postar, da necessidade surgiu o problema (ainda não virou solução) e ai queria a opinião de vocês.

Aqui na empresa onde trabalho, tem um sistema onde todo final de mês preciso alterar manualmente um arquivo de licença,
que é um arquivo texto e ainda preciso editar no bloco de notas e inserir uma informação a mais nesse texto, gravar e fazer a substituição com o do mês anterior.
Arcaico eu sei, poderia ser uma api atualizando automático, ou nem ser assim, mas é o que temos.

Então, resolvi tentar automatizar isso; Criei um app com a STL mesmo padrão, console, que passando 3 parâmetros obrigatórios que seriam:
- arquivo de entrada, texto a ser localizado e texto a ser substituído.
O 4o parâmetro ficou opcional, seria arquivo de saída. Se não colocar nada, grava por cima do arquivo de entrada.
Fica tudo na memória, depois que o ifstream lê, fecha o arquivo original..
basicamente usei ifstream e ofstream
Compilei no VS 2019
essa é a "cara" do aplicativo com uma execução de exemplo printado:

image.png

image.png
Daí, a ideia era colocar pra rodar a partir um script bat na máquina, onde roda o tal sistema que tem o arquivo de licença e executar com o agendador de tarefas na data que tem que substituir o arquivo.
Num horário neutro, testei com o sistema o arquivo de licença modificado pelo aplicativo.
Resultado: Não entrava... ele importou o arquivo mas estranhou, alegou problemas ou corrompido.. parou.
Embora estivesse idêntico do mesmo jeito certinho que eu fazia manualmente... Kkkkk
Resolvi, claro, colocar o arquivo original lá, modificado na mão e tudo certo voltou a funcionar.
Só que agora, estou tentando entender o que aconteceu, porque o meu arquivo foi rejeitado e o original (acabei fazendo do jeito que faço sempre editando na mão) funcionou

Uma hipótese que levantei talvez seja na gravação do novo arquivo, os caracteres de fim de linha ( vulgo enter ou \n ou \0 eu acho )
q sei que no Windows é cr,lf e no Linux é outro caracter..  mas não dizer em qual ambiente o arquivo que recebo todo mês, foi criado.
o problema é que não consigo provar isso!
Tanto que quando se tenta abrir um arquivo txt gerado num Linux pelo notepad, aparece tudo desconfigurado. Acho que os ascii são diferentes, que me diz?
Não é o caso desse arquivo, abre certinho sempre no notepad.

Abaixo o código fonte, quiserem "brincar" também

[]s   angelo


#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char* argv[]) {

    // Verificar parâmetros
    if (argc < 4) {
        cout << "Uso:" << endl;
        cout << "TrocaString.exe <arquivoEntrada> <textoBusca> <textoNovo> [arquivoSaida]" << endl;
        cout << "Dica: <textoBusca> <textoNovo> coloque o texto entre aspas " << endl;
        cout << "[arquivoSaida] eh opcional" << endl;
        return 1;
    }

    string arquivoEntrada = argv[1];
    string textoBusca = argv[2];
    string textoNovo = argv[3];

    // Arquivo de saída opcional
    string arquivoSaida;

    if (argc >= 5) {
        arquivoSaida = argv[4];
    } else {
        arquivoSaida = "saida.txt";
    }

    // Abrir arquivo de entrada
    ifstream arquivoIn(arquivoEntrada);

    if (!arquivoIn.is_open()) {
        cout << "Erro ao abrir arquivo: " << arquivoEntrada << endl;
        return 1;
    }

    // Ler conteúdo
    string conteudo;
    string linha;

    while (getline(arquivoIn, linha)) {
        conteudo += linha + "\n";
    }

    arquivoIn.close();

    // Substituir TODAS as ocorrências
    size_t pos = 0;
    int contador = 0;

    while ((pos = conteudo.find(textoBusca, pos)) != string::npos) {
        conteudo.replace(pos, textoBusca.length(), textoNovo);
        pos += textoNovo.length();
        contador++;
    }

    // Criar arquivo de saída
    ofstream arquivoOut(arquivoSaida);

    if (!arquivoOut.is_open()) {
        cout << "Erro ao criar arquivo: " << arquivoSaida << endl;
        return 1;
    }

    arquivoOut << conteudo;
    arquivoOut.close();
   
    cout << "Arquivo gerado: " << arquivoSaida << endl;
    cout << "Ocorrencias substituidas: " << contador << endl;
   
    return 0;
}



Josué Andrade Gomes

unread,
Jun 2, 2026, 2:58:13 PM (yesterday) Jun 2
to ccppb...@googlegroups.com
Use um editor hexadecimal para comparar o arquivo que funciona com o que o seu programa gera.

Acho que o VS Code tem um editor nativo.

angelo

unread,
Jun 2, 2026, 5:27:24 PM (24 hours ago) Jun 2
to ccppb...@googlegroups.com
Seguindo a dica do Josué

Usei um editor Hexa online ( hexed.it  )  e acho que, peguei uma pista do que pode ter ocorrido:

- Visto a olho nu, digamos assim, os arquivos são idênticos.
- Se olhar com mais detalhe o nome dos arquivos, o tamanho deles.. os gerados pelo meu app, vieram com 1 ou 2 bytes a mais... ( Opa..) 

criei dois arquivos  txt com a string  chave=X  
então, com o bloco de notas, editei o primeiro e alterei a string para chave=XXX
e com o aplicativo, alterei o segundo arquivo tambem para  chave=XXX

 No editor Hexa a situação se revelou:  
-  O que foi editado no bloco de notas, no final, apareceu o hexa do fim do arquivo. 
- No do aplicativo, 2 enters e fim do arquivo.

Talvez esse enter a mais esteja fazendo a diferença e tenha feito o arquivo ser rejeitado pelo sistema.
mas foi saída do ofstream.. vou ter que depurar depois pra entender esse comportamento.de inserir a mais

image.png


editado pelo Trocastring  

image.png





--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver esta conversa, acesse https://groups.google.com/d/msgid/ccppbrasil/CACVaizT%3Dfc-fX2WutDBE%3DhTvGt2VRf5dyUpq%2BL2Z2K1_0bWpGQ%40mail.gmail.com.

Bruno Sanches

unread,
10:08 AM (7 hours ago) 10:08 AM
to ccppb...@googlegroups.com
Experiementa abrir o arquivo de saída em modo binário, pode ser que a ofstream por ser modo texto coloque algo a mais...

MAs acho que é só mudar aqui:

  while (getline(arquivoIn, linha)) {
        conteudo += linha + "\n";
    }

tirar esse \n, pois os caracteres a mais é justamente o \r\n, padrão do windows. Se vc ligar modo binário o seu \n não vai gerar o \r mas o arquivo original parece que nem o \n tem...

Bruno Sanches
========================
https://github.com/bcsanches



Reply all
Reply to author
Forward
0 new messages