Daniel92 0 Denunciar post Postado Março 7, 2011 Eu estou tentando criar um programa com a seguinte logica: O programa pede para o usuario informar um nome de arquivo a ser lido. Minha intenção é que seja um simples arquivo de text. O programa verifica se existe tal arquivo. Como é um programa basico, ele vai ler o arquivo na mesma pasta. Se ele existir o programa vai abrir e mostrar o que há escrito nele. Caso não exista, passaremos para a parte que o usuario irá digitar algo no teclado. O programa irá pegar os numeros que foram escritos pelo usuario e irá jogalos em um vetor. E irá salvar o vetor no bloco de notas (.txt). Após isso, o programa irá ordenar os vetores, mostrar na tela e verificar se o usuario gostaria de salvar. O meu grande problema é que eu não consigo fazer a função leitura.open(nome_arquivo) ser aceita na compilação, provavelmente algo que falta a escrever. Em todos exemplos que eu vi, no lugar do 'nome_arquivo' eles colocavam algo fixo como "texto.txt", mas eu queria colocar algo em que o usuario definiria o nome. Alguem pode me dar uma luz? OBS: O programa que eu fiz está assim #include <stdio.h> #include <stdlib.h> #include <string> #include <math.h> #include <iostream> #include <fstream> using namespace std; char letra; int i,z,y,x=0,j=0,aux,w=0; int main () { string nome_arquivo; // * string equivale a um vetor de tamanho indeterminado * string palavras; string numeros; ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario * ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' * cout << "Escreva o nome do arquivo a ser aberto\n" ; getline(cin, nome_arquivo); //* le o nome do arquivo a ser lido * leitura.open(nome_arquivo); // * o programa abrirá o arquivo de nome informado pelo usuario * if(!leitura.is_open( )) // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario * { cout<<"Não foi possível abrir arquivo!\n"; leitura.clear( ); //reseta o objeto leitura x=1; } if(x=0) // * essa função escreve na tela tudo que está contido no arquivo que foi aberto anteriormente * { while (leitura.get(letra)) {cout << letra;} leitura.close(); } if(x=1) { printf("Digite algo\n"); getline(cin, palavras); // * pega o que o usuario escreveu e salva na string 'palavras' * for (i=0, i++, i<40) { if(isdigit(palavras(i)) // * verifica se a informação salva na casa 'i' da string 'palavras' é um número * { numeros(j) = atoi(palavras(i)); // * joga o numero encontrado na primeira casa livre da string 'numeros' * j=j+1; // * passa para a proxima casa da string 'numeros' * } } j=0; } escreve.open(nome_arquivo,.txt); // * associa o objeto 'escreve' ao nome do arquivo informado * while (escreve.get(nome_arquivo,.txt)) {escreve << numeros << "\n";} // * salva a string * escreve.close(); // * encerra o objeto escreve (?)* while (w=0) // * ordena os numeros presentes na string 'numeros' * { w=1; for(i=0,i<=40,i++) if numeros[i]<numeros[i+1] { w=0; aux=numeros[i+1]; numeros[i+1]=numeros[i]; numeros[i]=aux; } } } Muitas coisas ai como o 'using namespace std;' eu não faço minima ideia de como funciona. Para fazer esse programa eu peguei 1 exemplo de ifstream e 1 de ofstream e tentei juntar-los. EDIT: Eu resolvi abandonar o getline e o cout porque sempre dava erro e etc. Como estou mais familiarizado com o scan e print, reconstrui o programa com base neles. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <iostream> #include <fstream> #include <ctype.h> using namespace std; char letra,nome[20],palavra[30]; int i,z,y,x=0,j=0,aux,w=0; float numero[30],M; int main () { ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario * ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' * printf("Escreva o nome do arquivo a ser aberto\n"); scanf("%s", &nome); //* le o nome do arquivo a ser lido * leitura.open(nome); // * o programa abrirá o arquivo de nome informado pelo usuario * while (leitura.get(letra)) {cout << letra;} if(!leitura.is_open( )) // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario * { cout<<"Não foi possível abrir arquivo!\n"; leitura.clear( ); // * reseta o objeto leitura * leitura.close(); // * fecha o objeto de leitura * printf("Digite algo\n"); scanf("%s", &palavra); // * pega o que o usuario escreveu e salva na string 'palavras' * M=strlen(palavra); while(j<M) // * esse while vai tirar todas as letras do vetor palavra e só deixar os numeros * { if(!isdigit(palavra[j])) { while (j<M) {palavra[j]=palavra[j+1]; j+=1;} j=0; M-=1; } else j+=1; } j=0; escreve.open(nome); // * associa o objeto 'escreve' ao nome do arquivo informado * escreve << palavra; // * ele escreve o vetor palavra no arquivo 'nome' escreve.close(); // * encerra o objeto escreve (?)* printf(" o que foi escrito no arquivo foi: \n"); j=0; printf("%s", palavra); } system("pause"); return(0); } Ainda falta eu fazer a parte em que ele ordena o vetor e salva. Acho que o programa ta funcionando legal agora, mas eu tenho mais algumas duvidas: Tem como eu fazer o usuario nao necessitar digitar o .txt no final? Existe como eu configurar a string que o usuario vai informar pra ele salvar tpw assim: 12 13 54 65 767 g f r? Tpw um numero com mais de 1 digito e ir separando por espaço? E se eu tivesse que fazer usando getline, cout e string ao inves de scanf, printf e char[x]? Grato. Compartilhar este post Link para o post Compartilhar em outros sites
quitZAUMMM 18 Denunciar post Postado Março 9, 2011 Bom: 1-) veja sobre strcat; 2-) se for em tempo que o usuario escreve, vai ter q ler caracter por caracter, senaum, da pra fazer isso depois usando isdigit pra saber se é digito. 3-) vamos tentar mudar? []s Compartilhar este post Link para o post Compartilhar em outros sites
Daniel92 0 Denunciar post Postado Março 9, 2011 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <iostream> #include <fstream> #include <ctype.h> using namespace std; char letra,nome_arquivo[20],palavra[30],z[30]; int i,y=0,x=0,j=0,aux,w=0; float numero[30],M; int main () { z[0]='s'; char sf[5]; // * essa variavel serve para que o usuario não precise digitar .txt no final do nome do arquivo * sf[0]='.'; sf[1]='t'; sf[2]='x'; sf[3]='t'; ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario * ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' * printf("Escreva o nome do arquivo a ser aberto\n"); scanf("%s", &nome_arquivo); //* le o nome do arquivo a ser lido * strcat(nome_arquivo,sf); // * strcat(s1,s2) onde s1 e s2 são 2 strings; essa função joga a s2 na s1, sem apagar o que havia antes na s1; ex: s1=oi, s2=tchau, strcat(s1s2), printf("%s",s1)=oitchau * leitura.open(nome_arquivo); // * o programa abrirá o arquivo de nome informado pelo usuario * while (leitura.get(letra)) {cout << letra;} // * se o arquivo for aberto com sucesso o programa irá escrever todo seu conteudo na tela * printf("\n"); if(!leitura.is_open( )) // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario * { cout << "Nao foi possível abrir arquivo!\n\n"; leitura.clear(); // * reseta o objeto leitura * leitura.close(); // * fecha o objeto de leitura * while(z[0]=='s') { printf("Digite algo\n"); scanf("%s", &palavra); // * pega o que o usuario escreveu e salva na string 'palavras' * M=strlen(palavra); // * strlen() é o tamanho da string. Ex: z[100]='ola', strlen(z) será 3 * while(j<M) // * esse while vai tirar todas as letras do vetor palavra e só deixar os numeros * { if(!isdigit(palavra[j])) { while (j<M) { palavra[j]=palavra[j+1]; j+=1; } j=0; M-=1; } else j+=1; } j=0; escreve.open(nome_arquivo, ofstream::app); // * associa o objeto 'escreve' ao nome do arquivo informado, ofstream::app serve para ele não apagar o que já existia anteriormente no arquivo * escreve << palavra << "\n"; // * ele escreve o vetor palavra no arquivo 'nome_arquivo' * escreve.close(); // * encerra o objeto escreve (?)* printf("O que foi escrito no arquivo foi: \n"); // * mostra o que efetivamente foi escrito no arquivo * printf("%s \n", palavra); printf("\n\n Deseja escrevar na proxima linha do arquivo? (s/n) \n"); // * da a opção para o usuario escrever na proxima linha do arquivo * scanf("%s",&z); while ( ((z[0]!='s')&&(z[0]!='n')) || (strlen(z)!=1)) { printf(" sim (s) ou nao(n) \n"); scanf("%s",&z); } y=1; } } system("pause"); return(0); } Adicionei a opção de escrever na próxima linha do arquivo de texto. Retirei a necessidade de escrever .txt no nome do arquivo graças a função strcat (obrigado quitZAUMMM). Porém ainda tem algumas coisas que eu gostaria de entender: Existe algum meio de eu, quando abrir o arquivo, gravar os numeros e orientalos? Por exemplo: Abri o arquivo xxx.txt, ai o programa escreveu: 676 335 46 345 86 Ai o programa le e ordena: 46 86 335 345 676 Gostaria de uma forma para orienta-los em ordem crescente e regravar no arquivo. Acho que poderia ser usado com a função leitura.get(letra) , porém não tenho ideia de seu funcionamento. Poderia me dar uma luz? Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Março 10, 2011 Olá! Poderia me dizer uma coisa? Por quê está misturando C++ com C usando bibliotecas da C em C++? Use ao invés disso (é a mesma coisa, só que nos padrões C++): <stdio.h> => <cstdio> <stdlib.h> => <cstdlib> <string.h> => <cstring> (para usar a o tipo de dado string, não uma matriz de caracteres, inclua <string> também) <math.h> => <cmath> <ctype.h> => <cctype> Como pode ver, nas bibliotecas da C convertidas em C++, é só adicionar um C antes e tirar o .h Misturar as 2 linguagens não é uma boa prática. Use C ou C++. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Daniel92 0 Denunciar post Postado Março 10, 2011 Olá! Poderia me dizer uma coisa? Por quê está misturando C++ com C usando bibliotecas da C em C++? Use ao invés disso (é a mesma coisa, só que nos padrões C++): <stdio.h> => <cstdio> <stdlib.h> => <cstdlib> <string.h> => <cstring> (para usar a o tipo de dado string, não uma matriz de caracteres, inclua <string> também) <math.h> => <cmath> <ctype.h> => <cctype> Como pode ver, nas bibliotecas da C convertidas em C++, é só adicionar um C antes e tirar o .h Misturar as 2 linguagens não é uma boa prática. Use C ou C++. Abraços :D Veja bem, eu nem fazia ideia que eu estava usando o C++. Para mim, isso tudo era C. Pelo o que você falo, as bibliotecas com de C++ começam com C e tiram o .h? Mas tem algum comando que eu esteja usando que não esta de acordo com C? Compartilhar este post Link para o post Compartilhar em outros sites
Renato Utsch 24 Denunciar post Postado Março 10, 2011 Olá! As bibliotecas da C tem o .h no final. As bibliotecas da C adaptadas para C++ começam com c, seguidas do nome da biblioteca da C e sem o .h no final. As bibliotecas somente da C++ (na maioria das vezes) não começam com c e (em todas as vezes) não tem o .h do final. Além disso, a instrução using namespace std; é somente da C++. Sugiro que leia um livro para aprender a diferenciar as 2. Abraços :D Compartilhar este post Link para o post Compartilhar em outros sites
Daniel92 0 Denunciar post Postado Março 13, 2011 Vlw por falar isso. Eu perguntei para meu professor e ele confirmou. Ele falou também que não liga de misturarmos C com C++, mas todavia tentarei evitar de misturar ambas as linguagens. Obrigado a todos. Para quem quiser ver como meu codigo ficou, abaixo se encontra ele. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <iostream> #include <fstream> #include <ctype.h> using namespace std; char letra,nome_arquivo[20],palavra[30],z[30],a[30],n[15]; int i,y=0,x=0,j=0,aux,w=0,k[30],aa,aux2,aux3; float numero[30],M; int main () { hell: y=0; x=0; j=0; w=0; z[0]='s'; char sf[5]; // * essa variavel serve para que o usuario não precise digitar .txt no final do nome do arquivo * sf[0]='.'; sf[1]='t'; sf[2]='x'; sf[3]='t'; ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario * ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' * printf("Escreva o nome do arquivo a ser aberto\n"); scanf("%s", &nome_arquivo); //* le o nome do arquivo a ser lido * strcat(nome_arquivo,sf); // * strcat(s1,s2) onde s1 e s2 são 2 strings; essa função joga a s2 na s1, sem apagar o que havia antes na s1; ex: s1=oi, s2=tchau, strcat(s1s2), printf("%s",s1)=oitchau * leitura.open(nome_arquivo); // * o programa abrirá o arquivo de nome informado pelo usuario * while (leitura.get(letra)) {cout << letra;} // * se o arquivo for aberto com sucesso o programa irá escrever todo seu conteudo na tela * printf("\n"); if(!leitura.is_open( )) // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario * { cout << "Nao foi possível abrir arquivo!\n\n"; leitura.clear(); // * reseta o objeto leitura * leitura.close(); // * fecha o objeto de leitura * while(z[0]=='s') { printf("Digite algo\n"); scanf("%s", &palavra); // * pega o que o usuario escreveu e salva na string 'palavras' * M=strlen(palavra); // * strlen() é o tamanho da string. Ex: z[100]='ola', strlen(z) será 3 * while(j<M) // * esse while vai tirar todas as letras do vetor palavra e só deixar os numeros * { if(!isdigit(palavra[j])) { while (j<M) { palavra[j]=palavra[j+1]; j+=1; } j=0; M-=1; } else j+=1; } j=0; escreve.open(nome_arquivo, ofstream::app); // * associa o objeto 'escreve' ao nome do arquivo informado, ofstream::app serve para ele não apagar o que já existia anteriormente no arquivo * escreve << palavra << "\n"; // * ele escreve o vetor palavra no arquivo 'nome_arquivo' * escreve.close(); // * encerra o objeto escreve (?)* printf("O que foi escrito no arquivo foi: \n"); // * mostra o que efetivamente foi escrito no arquivo * printf("%s \n", palavra); printf("\n\n Deseja escrevar na proxima linha do arquivo? (s/n) \n"); // * da a opção para o usuario escrever na proxima linha do arquivo * scanf("%s",&z); while ( ((z[0]!='s')&&(z[0]!='n')) || (strlen(z)!=1)) { printf("sim (s) ou nao(n) \n"); scanf("%s",&z); } y=1; } } leitura.clear(); // * reseta o objeto leitura * leitura.close(); // * fecha o objeto de leitura * printf("Deseja ordenar os numeros presentes no arquivo? (s/n) \n"); // * verificando se o usuario deseja usar a função de ordenar os numeros presentes no arquivo * scanf("%s",&z); while ( ((z[0]!='s')&&(z[0]!='n')) || (strlen(z)!=1)) { printf("sim (s) ou nao(n) \n"); scanf("%s",&z); } i=0; j=0; aux3=0; if(z[0]=='s') { leitura.open(nome_arquivo); while(leitura.getline(n, 15)) // * essa função vai pegar cada linha do arquivo 'nome_arquivo', retirar todas as letras e salvar cada linha em uma casa de um vetor de inteiros * { M=strlen(n); // * strlen() é o tamanho da string. Ex: z[100]='ola', strlen(z) será 3 * while(j<M) // * esse while vai tirar todas as letras do vetor 'n' e só deixar os numeros * { if(!isdigit(n[j])) { while (j<M) { n[j]=n[j+1]; j+=1; } j=0; M-=1; } else j+=1; } j=0; k[i] = atoi (n); i+=1; } leitura.close(); aux3=i; // * como o strlen() só serve para vetores do tipo char, esse aux nos será util futuramente para saber quantos numeros efetivamente foram salvos no vetor 'k[]' * aa=1; while(aa==1) // * esse while vai ordenar o vetor de numeros inteiros o qual está salvo os numeros do arquivo 'nome_arquivo' * { i=0; aa=0; while(i<((aux3)-1)) { if(k[i]>k[i+1]) { aux2=k[i]; k[i]=k[i+1]; k[i+1]=aux2; aa=1; } i+=1; } } i=0; escreve.open("Arquivo_ordenado.txt"); // * essa parte se destina a salvar, na ordem crescente, os numeros do arquivo 'nome_arquivo' * printf("O arquivo foi re-escrito da seguinte forma:\n"); while(i<aux3) { printf("%d \n",k[i]); escreve << k[i] << "\n"; i+=1; } escreve.close(); // * onde termina o processo de salvar os numeros no novo arquivo, em ordem * } printf("Repitir o programa? (s/n)\n"); // * ciclo de repetição do programa scanf("%s",&a); while ( ((a[0]!='s')&&(a[0]!='n')) || (strlen(a)!=1)) { printf("sim (s) ou nao(n) \n"); scanf("%s",&a); } if(a[0]=='s') { system("cls"); goto hell; } return(0); } Sei que dava para eu separar em varias funções, não usar goto e etc. Mas ainda vou fazer muitos exercicios ao longo do meu curso de engenharia eletrica, intaum vou aprendendo sobre isso. Compartilhar este post Link para o post Compartilhar em outros sites