Enviado em 18/11/2018 - 12:21h
Bom , esse exercício é para faculdade, mas estou tendo problemas com alguns erros que não consigo arrumar nem com poder divino.#include <iostream> #include <string.h> #include <math.h> #include <cstdio> using namespace std; typedef struct reg { char nome [20]; char tel [20]; char email [20]; }; int tamanho (FILE * ); void cadastrar (FILE *); void consultar (FILE *); void gerararqtxt (FILE *); int main() { int op; FILE *arq; if ((arq = fopen("dados.dat" , "rb+")) == NULL) //fopen abrindo o arquivo { if ((arq = fopen ("dados.dat", "wb+")) == NULL) // sinal de + é para ler e escrever { cout << "Falha ao abrir o arquivo\n"; system("pause"); } } do { system ("clear"); cout << "========== AGENDA =========="; cout << "\n 1 - Cadastrar\n"; cout << "\n 2 - Consultar\n"; cout << "\n 3 - Gerar arquivo\n"; cout << "\n 4 - Sair\n"; cout << "========== Contatos: %d=\n", tamanho(arq); cout << "Opção: "; cin >> op; switch (op) { case 1: // Cadastrar novo contato cadastrar(arq); break; case 2: //Consultnado contato por registro consultar (arq); break; case 3: //Gerando arquivo txt com todos os contatos gerararqtxt(arq); break; case 4: //fechando arquivo fclose(arq); } }while (op != 4); } void cadastrar(FILE *arq) { class reg contato; char confirma; fflush(stdin); // fflush para limpar o buffer cout << "Cadastrando novo registo: \n"; cout << "\n Numero do registro: \n", tamanho(arq) +1; getchar(); cout << "Nome................: "; fgets(contato.nome, 15 , stdin);// Aqui era para usar o gets cout << "\nTelefone..........: "; fgets(contato.tel, 15, stdin); // Aqui tambem cout <<"\nEmail..............: "; fgets (contato.email, 20 ,stdin);// Aqui tambem cout << "\nConfirma <s/n>: "; cin >> confirma; if (toupper(confirma) == 'S') { cout << "\n Gravando ....: \n"; fseek(arq,0,SEEK_END); fwrite(&contato, sizeof(reg), 1, arq); } } int tamanho(FILE *arq) { fseek(arq, 0,SEEK_END); return ftell(arq) / sizeof(reg); } void consultar(FILE *arq) { reg contato; int nr; cout << "\n Consulta pelo Codigo\n"; cout << "\n Informe o Código....: "; cin >> nr; if ((nr <= tamanho(arq)) && (nr > 0)) { fseek(arq, (nr - 1) * sizeof (reg), SEEK_SET); fread(&contato, sizeof (reg), 1, arq); cout << "\n Nome............:", contato.nome; cout << "\n Telefone........:", contato.tel; cout << "\n ne-mail...........:", contato.email; } else { cout << "\n Número de registro inválido!"; } system("pause"); } void gerararqtxt(FILE *arq) { char nomearq [20]; cout << "Digite o nome do arquivo"; cin >> nomearq; strcat (nomearq,".txt"); FILE *arqtxt = fopen(nomearq, "w"); if (!arqtxt); { cout << "Não foi possível criar esse arquivo!\n"; system("pause"); return; } fprintf(arqtxt, "Nome Telefone email\n"); fprintf(arqtxt, "==============================================\n"); int nr; reg contato; for (nr = 0; nr < tamanho(arq); nr++) { fseek(arq, nr * sizeof(reg), SEEK_SET); fread(&contato, sizeof(reg), 1, arq); fprintf(arqtxt, "%-20s-%12s%-20s\n", contato.nome, contato.tel, contato.email); fprintf(arqtxt, "===========================================================\n"); fclose(arqtxt); } }
Enviado em 19/11/2018 - 16:49h
#ifdef linux int gets_s(char *dest, size_t dest_size){ if(!dest || dest_size==0) return (errno=EINVAL); errno=0; if(!fgets(dest, dest_size, stdin)){ dest[0]='\0'; return errno; } size_t len=strlen(dest); if(len==dest_size-1 && dest[len-1]!='\n'){ int discarded; do discarded=getchar(); while(discarded!='\n' && discarded!=EOF); } else if(dest[len-1]=='\n') dest[len-1]='\0'; return 0; } #endif
Enviado em 21/11/2018 - 15:30h
#include <iostream> #include <string.h> #include <math.h> #include <cstdio>
#include <algorithm> // Algoritmos padronizado (para usar std::min, abaixo) #include <fstream> #include <iomanip> // Manipuladores de I/O (para usar std::flush, abaixo) #include <iostream> #include <string> #include <cctype> #include <cstring>
using namespace std; typedef struct reg
{ char nome [20]; char tel [20]; char email [20];
reg(bool zeradados=false){ if(zeradados) memset(this, 0, sizeof *this); }
}; int tamanho (FILE * ); void cadastrar (FILE *); void consultar (FILE *); void gerararqtxt (FILE *);
size_t tamanho(fstream &); void cadastrar(fstream &); void consultar(fstream &); void gerararqtxt(fstream &);
int main() { int op; FILE *arq; if ((arq = fopen("dados.dat" , "rb+")) == NULL) //fopen abrindo o arquivo { if ((arq = fopen ("dados.dat", "wb+")) == NULL) // sinal de + é para ler e escrever { cout << "Falha ao abrir o arquivo\n"; system("pause"); } }
fstream arq("dados.dat", ios_base::in|ios_base::out|ios_base::binary|ios_base::app); if(!arq){ cerr << "Falha ao abrir o arquivo. Saindo do programa.\n"; return 1; }
do { system ("clear");
cout << "========== AGENDA =========="; cout << "\n 1 - Cadastrar\n"; cout << "\n 2 - Consultar\n"; cout << "\n 3 - Gerar arquivo\n"; cout << "\n 4 - Sair\n"; cout << "========== Contatos: %d=\n", tamanho(arq); cout << "Opção: ";
cout << "========== AGENDA ==========\n" "1 - Cadastrar\n" "2 - Consultar\n" "3 - Gerar arquivo\n" "4 - Sair\n" "========== Contatos: " << tamanho(arq) << "\n" "Opção: " << flush ;
cin >> op;
string line; if(!getline(cin, line)){ cerr << "\nErro de leitura ao ler opção do terminal. Saindo do programa.\n"; return 1; } size_t nao_numerico; op=stoi(line, &nao_numerico); if(nao_numerico<line.length() && !isspace(line[nao_numerico])) op=0;
switch (op) { case 1: // Cadastrar novo contato cadastrar(arq); break; case 2: //Consultnado contato por registro consultar (arq); break; case 3: //Gerando arquivo txt com todos os contatos gerararqtxt(arq); break; case 4: //fechando arquivo fclose(arq);
} }while (op != 4); } void cadastrar(FILE *arq)
void cadastrar(fstream &arq)
{ class reg contato;
reg contato(true); // Força o construtor a zerar qualquer conteúdo anterior da memória ocupada pelo objeto.
char confirma;
string line;
fflush(stdin); // fflush para limpar o buffer
cout << "Cadastrando novo registo: \n"; cout << "\n Numero do registro: \n", tamanho(arq) +1;
cout << "Número do registro: " << 1+tamanho(arq) << "\n\n";
getchar();
cout << "Nome................: "; fgets(contato.nome, 15 , stdin);// Aqui era para usar o gets
if(!getline(cin, line)){ cerr << "\nErro de leitura no terminal. Saindo do programa.\n"; exit(1); } strncpy(contato.nome, line.c_str(), min(sizeof contato.nome, line.length()));
cout << "\nTelefone..........: "; fgets(contato.tel, 15, stdin); // Aqui tambem cout <<"\nEmail..............: "; fgets (contato.email, 20 ,stdin);// Aqui tambem cout << "\nConfirma <s/n>: "; cin >> confirma;
if(!getline(cin, line)){ /* Aborta, como acima. */ }
if (toupper(confirma) == 'S')
// Note que eu uso declaração dentro de if(), conforme padrão C++17. if( size_t non_space{line.find_first_not_of(" \t\n\r\f")}; non_space<line.lenght() && toupper(line[non_space])=='S' )
{ cout << "\n Gravando ....: \n"; fseek(arq,0,SEEK_END);
fwrite(&contato, sizeof(reg), 1, arq);
arq.write(reinterpret_cast<char *>(&contato), sizeof contato); if(!arq){ cerr << "\nErro ao gravar registro: " << strerror(errno) << ". Saindo do programa.\n"; exit(1); }
} } int tamanho(FILE *arq) { fseek(arq, 0,SEEK_END); return ftell(arq) / sizeof(reg); }
size_t tamanho(fstream &arq){ auto old_offset=arq.tellg(); size_t result=arq.seekg(0, ios_base::end).tellg()/sizeof(reg); arq.seekg(old_offset, ios_base::beg); return result; }
void consultar(FILE *arq) { reg contato; int nr; cout << "\n Consulta pelo Codigo\n"; cout << "\n Informe o Código....: "; cin >> nr; if ((nr <= tamanho(arq)) && (nr > 0)) { fseek(arq, (nr - 1) * sizeof (reg), SEEK_SET); fread(&contato, sizeof (reg), 1, arq); cout << "\n Nome............:", contato.nome; cout << "\n Telefone........:", contato.tel; cout << "\n ne-mail...........:", contato.email; } else { cout << "\n Número de registro inválido!"; } system("pause"); }
void gerararqtxt(FILE *arq) { char nomearq [20]; cout << "Digite o nome do arquivo"; cin >> nomearq; strcat (nomearq,".txt"); FILE *arqtxt = fopen(nomearq, "w");
string nomearq; cout << "Digite o nome do arquivo (sem sufixo/extensão): "; getline(cin, nomearq); ofstream arqtxt(nomearq+".txt", ios_base::out|ios_base::trunc);
if (!arqtxt);
{ cout << "Não foi possível criar esse arquivo!\n"; system("pause"); return; } fprintf(arqtxt, "Nome Telefone email\n"); fprintf(arqtxt, "==============================================\n"); int nr; reg contato; for (nr = 0; nr < tamanho(arq); nr++)
const auto tam_arq=tamanho(arq); for(size_t nr=0; nr<tam_arq; nr++)
for( arq.seekg(0, ios_base::beg); arq.read(reinterpret_cast<char *>(&contato), sizeof contato); /* Nada! */ )
{ fseek(arq, nr * sizeof(reg), SEEK_SET); fread(&contato, sizeof(reg), 1, arq);
fprintf(arqtxt, "%-20s-%12s%-20s\n", contato.nome, contato.tel, contato.email);
arqtxt.setiosflags(arqtxt.left); arqtxt << setw(20) << string(contato.nome, min(sizeof contato.nome, 20)) << setw(12) << string(contato.tel, min(sizeof contato.tel, 12)) << setw(20) << string(contato.email, min(sizeof contato.email, 20)) << '\n' ;
fprintf(arqtxt, "===========================================================\n"); fclose(arqtxt);
}
if(arq.bad()){ // Erro de sistema, mais do que apenas o fim do arquivo. cerr << "Erro grave de leitura. Saindo do programa.\n"; exit(1); } if(arq.eof()) arq.clear();
}
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
Instalar o VIM 9.1 no Debian 12
Como saber o range de um IP público?
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)