MacgyverPT Posted March 17, 2015 at 10:14 AM Report Share #579601 Posted March 17, 2015 at 10:14 AM (edited) Bom dia. Estou a ter dificuldade em guardar uma string em ficheiro .txt. Pretendo guardar uma string inserida pelo utilizador num ficheiro txt, mas a mesma, se tiver um "espaço" entre as letras/palavras apenas guarda até ao espaço. Ou seja, se o utilizador colocar "abc cba", no ficheiro só fica guardado o "abc". Alguém pode dar uma dica de como tentar resolver? Devo dizer que já pesquisei pelas "internets" Edited March 30, 2016 at 03:52 PM by M.offspring.R Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 17, 2015 at 11:03 AM Report Share #579604 Posted March 17, 2015 at 11:03 AM estou convicto que o problema não está na escrita mas sim na leitura o que quero dizer que(muito provavemente) o problema estavá no método usado para lr a string do teclado. faz output da string lida pelo utilizador para a consola e confirma que essa é na realidade a string com o espaço. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
jpcarvalho1992 Posted March 17, 2015 at 12:24 PM Report Share #579610 Posted March 17, 2015 at 12:24 PM Podes inserir o código aqui no forum? Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 17, 2015 at 01:45 PM Author Report Share #579614 Posted March 17, 2015 at 01:45 PM (edited) Boas. Aqui está o codigo: http://pastebin.com/MeeiyScH Neste momento comentei a linha que grava no ficheiro e estou a testar se a string inserida corresponde mesmo à inserida. Nota: o codigo está muito, muito incompleto. Estou so a fazer pequenos passos para não complicar logo de inicio. Prefiro ter a certeza que a string é bem copiada para depois passar ao passo seguinte. Edited March 17, 2015 at 01:46 PM by M.offspring.R Link to comment Share on other sites More sharing options...
Solution MacgyverPT Posted March 17, 2015 at 02:00 PM Author Solution Report Share #579616 Posted March 17, 2015 at 02:00 PM Consegui resolver. Não sei se foi a melhor maneira, mas fiz assim: Passei disto: scanf("%s", word->englishWord); fprintf(fEnglish, "%s\n", word->englishWord); Para isto: printf("Insert the word in lithuan: "); scanf("%[^\t\n]s", word->lithuanWord); Ou seja, alterei o scanf e a coisa ficou a funcionar. Há outra maneira de se fazer sem ser com isto? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 17, 2015 at 04:29 PM Report Share #579633 Posted March 17, 2015 at 04:29 PM antes de mais, bem me pareceria que o problema seria na entrada da string agora duas notas. - esse scanf tem um problema. imageina que a string lida é maior que o tamanho de word->lithuanWord ? tens de limitar o tamanho que o scanf pode ler scanf("%30[\t\n]s", word->lithuanWord); // A // | // maximo segundo, sim, existe outra maneira: // param1 : onde guardar a string // param2 : tamanho máximo da string (incluindo o caracter \0) // param3 : de onde ler fgets(word->lithuanWord, max_size_of_string, stdin); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 18, 2015 at 08:59 AM Author Report Share #579680 Posted March 18, 2015 at 08:59 AM (edited) aquela "max_size_of_string" posso usar o valor da constante definida no inicio do código? Edit: Obrigado, já percebi. Aproveito para colocar outra questão. O meu código trabalha com 2 ficheiros .txt (pelo menos em .txt para já, passarão mais tarde para binário). Guardo a primeira palavra no primeiro ficheiro, ele guarda bem, mas ao salvar a segunda palavra no segundo ficheiro, ele já não o faz e coloca "lixo" (os tais 35 char) antes da string inserida pelo user... Edited March 18, 2015 at 09:37 AM by M.offspring.R Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 18, 2015 at 09:18 AM Report Share #579682 Posted March 18, 2015 at 09:18 AM sim podes nota que eu só a usei para saberes que dados é que se devem colocar como parâmetro da função IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 18, 2015 at 10:22 AM Author Report Share #579694 Posted March 18, 2015 at 10:22 AM sim podes nota que eu só a usei para saberes que dados é que se devem colocar como parâmetro da função Certissimo. Obrigado mais uma vez! Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 19, 2015 at 03:08 PM Author Report Share #579834 Posted March 19, 2015 at 03:08 PM Aproveito para colocar outra questão. O meu código trabalha com 2 ficheiros .txt (pelo menos em .txt para já, passarão mais tarde para binário). Guardo a primeira palavra no primeiro ficheiro, ele guarda bem, mas ao salvar a segunda palavra no segundo ficheiro, ele já não o faz e coloca "lixo" (os tais 35 char) antes da string inserida pelo user... Algo se passa... Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 19, 2015 at 03:28 PM Report Share #579836 Posted March 19, 2015 at 03:28 PM apresenta o código que tens IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 19, 2015 at 04:11 PM Author Report Share #579842 Posted March 19, 2015 at 04:11 PM (edited) Aqui está: // DictionaryWindows.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #include <Windows.h> //Constant #define MAX_WORD_SIZE 35 //define max char size for each word (in lithuan and english) /* Structs zone */ struct Word{ char englishWord[MAX_WORD_SIZE]; char lithuanWord[MAX_WORD_SIZE]; }; /* Functions zone */ void insertWordLithuan(struct Word *word){ FILE *fLithuan; FILE *fEnglish; char temp[MAX_WORD_SIZE]; //for lithuan word fLithuan = fopen("..\\Debug\\data\\lithuanDictionary.txt", "a");//open the files in append mode. if (fLithuan == NULL){ //if file doesn't exit, create freopen("lithuanDictionary.txt", "wb", fLithuan); } printf("Insert the word in lithuan: "); //ask to user a word and save on file scanf("%35[\t\n]s", word->lithuanWord); //save the word in var lithuanWord (located in struct) fprintf(fLithuan, "%s\n", word->lithuanWord); //save on file //fputs(word->lithuanWord, fLithuan); fclose(fLithuan); //close the file // ========================== ENGLISH ========================== fEnglish = fopen("..\\Debug\\data\\englishDictionary.txt", "a");//open the files in append mode. if (fEnglish == NULL){ //if file doesn't exit, create freopen("englishDictionary.txt", "wb", fEnglish); } printf("Insert the word in english (translated): "); //ask to user a word and save on file scanf("%35[\t\n]s", word->englishWord); //save the word in var englishWord (located in struct) fprintf(fEnglish, "%s\n", word->englishWord); //save on file //fputs(word->englishWord, fEnglish); fclose(fEnglish); //close the file } int main(int argc, char* argv[]) { int option; //number of the option in main menu struct Word words; setlocale(LC_ALL, "Portuguese"); insertWordLithuan(&words); system("PAUSE"); return 0; } O código não está mt "clean", mas primeiro prefiro faze-lo funcional e só depois "limpar" Edited March 20, 2015 at 12:00 AM by thoga31 Código movido do Pastebin Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 19, 2015 at 04:27 PM Report Share #579843 Posted March 19, 2015 at 04:27 PM o teu problema é que estás a ler uma string do teclado com as seguintes condições de paragem: - a string lida não pode ter mais do que 34 caracteres (+1 para o '\0') - encontrou um caracter '\t' - encontrou um caracter '\n' ao leres uma string em que a leitura terminou devido ao encontrar um desses caracteres, o processo termina mas esse caracter fica no buffer de entrada. ao tentares ler a segunda palavra, o que a função de leitura vai encontrar é imediatamente um desses caracteres. o que achas que deverás fazer para contornar esta situação ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 19, 2015 at 04:39 PM Author Report Share #579844 Posted March 19, 2015 at 04:39 PM Pensei em "limpar" a string previamente usada, mas foi em vão. Sobre as condições de paragem, tinha a noção dos 35 char, como o array para guardar a palavra é de 35, convem ter alguma forma de paragem... digo eu 😛 No entanto se retirar essas condições, não me é efectuada o registo de uma string com um espaço entre palavras... Até pode ser uma coisa trivial e se calhar já andei lá perto, mas a verdade é que ainda não descobri como dar a volta a isto Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 19, 2015 at 04:49 PM Report Share #579847 Posted March 19, 2015 at 04:49 PM Pensei em "limpar" a string previamente usada, mas foi em vão. tens que "limpar" algo, mas não é a string lida ... é o buffer de entrada onde o caracter de paragem está "residente" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
MacgyverPT Posted March 20, 2015 at 01:47 PM Author Report Share #579893 Posted March 20, 2015 at 01:47 PM (edited) Boas. Obrigado pela ajuda. Depois de brigar com isto, com alguma pesquisa, resolvi o problema da seguinte maneira, acrescentando este excerto de código após ter guardado o input no ficheiro e de ter fechado o mesmo (antes de passar ao ficheiro seguinte): int ch; while ((ch = getchar()) != '\n' && ch != EOF); Agora é passar ao próximo passo. Obrigado HappyHippyHippo pela ajuda Edited March 20, 2015 at 01:55 PM by M.offspring.R Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted March 20, 2015 at 02:27 PM Report Share #579895 Posted March 20, 2015 at 02:27 PM exsite várias soluções, uma delas é realmente esse ciclo para limpar o buffer de entrada. outras soluções seriam: - o uso da função fgets vantagem : o caracter '\n' é removido do buffer de leitura desvantagem : esse mesmo caracter é inserido no buffer onde é guardado a string lida - adicionar o caracter no formato de leitura dado como parâmetro do scanf vantagem : novamente, o caracter '\n' é removido do buffer de leitura pois é validado pelo formato de leitura desvantagem : como estás a verificar a existência do caracter '\n' ou do '\t', a escrita do formato a ser esperado não é muito tradicional pois tens de validar para os dois casos fscanf("%35[^\t\n]%*[\t\n]", word->lithuanWord); // %35[^\t\n] - ler uma string com o máximo de 35 caracteres até encontrar o caracter '\t' ou o '\n' // %*[\t\n] - ler e ignorar uma string composta somente de '\n's e '\t's desta forma estás a ler a string e a limpar limpar o caracter de paragem tudo na mesma operação. além disso, se o caracter de paragem não for o '\n' ou o '\t' também não existe problema porque o formato simplesmente não vai ser validado interrompendo a leitura do buffer de leitura. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now