Jump to content

Guardar string em ficheiro .txt


MacgyverPT
 Share

Go to solution Solved by MacgyverPT,

Recommended Posts

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 by M.offspring.R
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 by M.offspring.R
Link to comment
Share on other sites

  • Solution

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

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
Link to comment
Share on other sites

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 by M.offspring.R
Link to comment
Share on other sites

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

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 by thoga31
Código movido do Pastebin
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

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 by M.offspring.R
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.