2
Guys, I’m having a question about how I should delete the last line of a file using the C language. Could someone please help me.
Below, follow my code.
int quantidadeDeUsuarios = 0;
Usuario *_usuario;
void sair() {
free(_usuario);
}
void removerUltimoNumero() {
FILE *arquivo;
char *linha = (char *) malloc(256 * sizeof(char));
char *buffer = (char *) malloc(1000 * sizeof(char));
char *ponteiro;
memset(buffer, 0, 1000 * sizeof(char));
ponteiro = buffer;
arquivo = fopen("usuarios", "r");
if(arquivo == NULL) {
cout << "Erro na abertura do arquivo" << endl;
return;
}
while(!feof(arquivo)) {
fgets(linha, 256, arquivo);
if(sizeof(linha) == true) {
strcpy(ponteiro, linha);
ponteiro += strlen(linha);
}
}
fclose(arquivo);
rescreveArquivo(arquivo, buffer);
free(linha);
free(buffer);
}
void rescreveArquivo(FILE *arquivo, const char *buffer) {
arquivo = fopen("usuarios", "w");
fprintf(arquivo, "%s", buffer);
fclose(arquivo);
}
void numeroDeUsuariosCadastrados() {
cout << "Número de usuários cadastrados: " << contadorDeLinhasDeUmArquivo() << endl;
}
int contadorDeLinhasDeUmArquivo() {
FILE *arquivo;
int numeroDeLinhas = 0;
arquivo = fopen("usuarios", "r");
if(arquivo == NULL) {
cout << "Erro na abertura do arquivo" << endl;
return 0;
}
while(EOF != (scanf("%*[^\n]") && scanf("%*c"))) {
++numeroDeLinhas;
}
return numeroDeLinhas;
}
void listarUsuarios() {
char *saida = (char *) malloc(256 * sizeof(char));
char espaco = ' ';
FILE *arquivo = fopen("usuarios", "r");
if(arquivo == NULL) {
cout << "Erro na Abertura do arquivo" << endl;
return;
}
cout << "=========================================================================================================================================================" << endl;
printf("| Nome %-25c | RG %-27c | CPF %-26c | Endereço %-41c |\n", espaco, espaco, espaco, espaco);
cout << "=========================================================================================================================================================" << endl;
for (int i = 1; fgets(saida, sizeof(saida), arquivo) != NULL; ++i) {
printf("%s", saida);
}
cout << endl << endl;
fclose(arquivo);
}
void cadastrarUsuario() {
Usuario *usuario;
usuario = _usuario;
if(quantidadeDeUsuarios > 0) usuario = (Usuario *) realloc(usuario, quantidadeDeUsuarios * sizeof(Usuario));
else usuario = (Usuario *) malloc(sizeof(Usuario));
if(!usuario) {
cout << "Exaustão de memória!" << endl;
exit(1);
}
__fpurge(stdin);
cin.clear();
cout << "Digite seu nome: ";
cin.getline(usuario[quantidadeDeUsuarios].nome, 100);
__fpurge(stdin);
cin.clear();
cout << "Digite seu RG: ";
cin.getline(usuario[quantidadeDeUsuarios].rg, 9);
__fpurge(stdin);
cin.clear();
cout << "Digite seu CPF: ";
cin.getline(usuario[quantidadeDeUsuarios].cpf, 11);
__fpurge(stdin);
cin.clear();
cout << "Digite seu Endereço: ";
cin.getline(usuario[quantidadeDeUsuarios].endereco, 100);
_usuario = usuario;
insereUsuario(_usuario);
quantidadeDeUsuarios++;
}
void insereUsuario(Usuario *pUsuario) {
FILE * arquivo;
if((arquivo = fopen("usuarios", "a+")) == NULL) {
cout << "Erro ao criar o arquivo";
}
fprintf(arquivo, "| %-30s | %-30s | %-30s | %-50s |\n",
pUsuario->nome,
pUsuario->rg,
pUsuario->cpf,
pUsuario->endereco
);
fclose(arquivo);
}
There’s so much wrong or bad in this code that I don’t know where to start (nor have I looked beyond what’s in the window). Will you decide whether to do it in C or C++? Can you guarantee that the line has 256 characters? I don’t think so, right? If I put all the code I might be able to do something, but I can’t promise because I don’t have a C compiler here to test.
– Maniero
https://github.com/codenome/Lista0-EstruturaDeDados/tree/master/Exericicio%207%20(MISSING%20FUN%C3%87%C3%83O%20DE%20EXCLUIR)/users Archive This is the project link! https://github.com/codenome/Lista0-EstruturaDeDados/blob/master/Exericicio%207%20(MISSING%20FUN%C3%87%C3%83O%20DE%20EXCLUIR)/users!
– Thiago Cunha
Another thing... I’m doing in C same... but in front of the teacher will use C++.
– Thiago Cunha