-2
I need to make a program that reads a text file, copies the information and transfers it to another file, but without the blank lines, without comment code (which starts at "//") and remove excess blank spaces between words. The le_clean_e_saved function does its job, but the clean_space function is returning empty strings, and therefore creating a new empty file. And I don’t know why you’re doing it. Somebody help please.
#include <iostream>
#include <fstream>
using namespace std;
void limpa_espacos(string &str)
{
int p1= 0; // ponteiro para string de entrada
int p2= 0; // para string de saida
string temp; // guarda a string a medida que é limpa
while(str[p1]!='\0') // varre a string ate o fim
{
temp[p2]= str[p1]; // copia uma posicao da string de entrada para temp
if(str[p1]==' ') // se essa posicao é um espaco
{
while(str[p1+1]!='\0' && str[p1+1]==' ') // enquanto nao chegar no fim da string e as
// proximas posicoes continuam sendo espacos
{
p1++; // vai empurrando o ponteiro da string de entrada
}
}
// senão, apenas incrementa ambos os ponteiros, ou incrementa de qualquer forma
p1++;
p2++;
}
temp[p2]= '\0'; // fecha a string
str= temp;
}
void le_limpa_e_salva (ifstream &lod, ofstream &sav, string st)
{
// enquanto tiver uma linha no arquivo com caracteres, esse "while" vai rodar
while (getline(lod, st)) // faz leitura de uma linha do arquivo
{
if(!st.empty() && (st[0] != '/' && st[1] != '/')) // se a linha nao estiver vazia
{
cout << "\nantes de limpar espacos: " << st << "\n";
limpa_espacos(st);
cout << "\ndepois de limpar espacos: " << st << "\n";
sav << st << "\n"; // grava essa linha no novo arquivo e pula para linha de baixo
}
}
lod.close();
sav.close();
cout << "\n\nArquivo copiado com sucesso!\n\n";
}
int main()
{
ifstream load;
ofstream save;
string str, apaga;
// arq_orig: guarda o nome do arquivo digitado pelo usuario (arquivo fonte)
// arq_dest: guarda o nome do arquivo digitado pelo usuario (arquivo de destino)
char arq_orig[1023], arq_dest[1023];
cout << "Digite o nome do arquivo a ser copiado, com sua extensao.\n";
cout << "Digite: ";
// muito melhor que colocar no codigo, o local do arquivo a ser lido
// e o local do novo arquivo a ser criado, pois para cada execucao
// em computador diferente, esse trecho do codigo deveria ser alterado.
// Alem disso, ha diferenca de formatacao desse caminho para Windows e Linux.
gets(arq_orig); // "pega" o nome digitado pelo usuario
load.open(arq_orig); // lê o arquivo com esse nome
if(load) // verificacao de erro
{
cout << "Digite o nome do arquivo que recebera o texto copiado, com sua extensao.\n";
cout << "Digite: ";
gets(arq_dest);
save.open(arq_dest);
if (save)
{
le_limpa_e_salva (load, save, str);
load.close();
save.close();
}
else
{
cout << "\n\nFalha ao criar arquivo de destino! Fechando programa.\n\n";
}
}
else
{
cout << "\n\nFalha ao abrir arquivo fonte! Fechando programa.\n\n";
}
return 0;
}
Problem solved.
– Marcos Goulart