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:


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;
}