none
Editar linha de arquivo txt RRS feed

  • Pergunta

  • Boa Tarde,

    Preciso que minha aplicação inclua um caractere no inicio da linha que o label apresentou. por exemplo, eu clico no botao para me apresentar uma pergunta e esta pergunta esta em um arquivo txt onde existem mais perguntas linha a linha. No entanto, eu não quero ler esta pergunta novamente quando abrir a minha aplicação. para isso, eu pensei em colocar um caracter no inicio da pergunta sempre que eu ler e assim coloco uma condição para não ler as linhas que comecem com este carácter.

    Não sei se consegui ser claro o suficiente, mas se alguém puder me ajudar eu agradeço.

    Ps. Hoje eu leio este text e quando fecho o sistema eu renomeio e ao abrir crio um novo txt, mas tenho que colocar todas as perguntas não lidas na mão.

    Um Abraço

    segunda-feira, 6 de maio de 2013 19:50

Respostas

  • Para retornar uma linha de um arquivo de texto,você precisa do índice da mesma (normalmente é o número da linha subtraindo 1).Para pegar uma aleatória use a função Random.

    Armazene a pergunta em uma variável para que possa buscar tal no arquvo e escrever o caractere.
    Em outra variável,armazene todo o texto do arquivo.

    Use a função Replace para substituir a pergunta pela mesma,com um caractere desejado para a diferenciação das perguntas já escolhidas e salve.

    Na hora de ler,basta verificar se a pergunta selecionada tem o caractere (Contains).Se tiver,pega uma outra linha aleatória.

    segunda-feira, 6 de maio de 2013 23:33
  • Não precisa usar um dicionário para isso.Vou explicar mais detalhadamente,passo-a-passo.


    1 - Variáveis Globais

    'Local do arquivo onde estão as perguntas dim perguntas as string() = io.file.readalllines("caminho do arquivo") dim rdn as random = new random()

    dim perguntaaleatoria as string

    2 - Função para pegar a pergunta aleatória

    private function obterPerguntaAleatoria as string
    
    dim tp as string
    
    for pa = 0 to perguntas.length - 1
    
    dim indicealeatorio as integer = rnd.next(perguntas.length - 1)
    
    if not perguntas(indicealeatorio).startswith("#") then
    
    tp = perguntas(indicealeatorio)
    perguntaaleatoria = perguntas(indicealeatorio)
    
    exit for
    
    end if
    
    next
    
    return tp
    
    end function

    3 - Usando a função

    label1.text = obterPerguntaAleatoria

    4 - Salvando

    private sub salvar
    
    dim src as string = ""
    
    for s = 0 to perguntas.length - 1
    
    if perguntas(s) = perguntaaleatoria then
    
    perguntas(s) = "#" & perguntaaleatoria
    
    end if
    
    src &= perguntas(s) & vbnewline
    
    next
    
    dim stw as new streamwriter("caminho do arquivo")
    stw.write(src)
    stw.close
    
    end sub

    Acho que deu pra entender.É um jeito simples e eficiente.Qualquer dúvidas,só responder.


    terça-feira, 7 de maio de 2013 15:05
  • Adilson,

    Todos um dia também foram iniciantes! Você não pode desistir. Se um caminho pelo qual está tentando ir, não está surtindo efeito, tente outro. Se você ficar atolado de vez, pare e vá resolver outro problema de seus projetos, porque quando você se afasta de um problema que você gastou muito tempo para resolver, você consegue ver o quadro de forma completa e assim, encontrar outro caminho para resolver a solução. Eu lembro quando comecei a querer programar e logo em seguida quando comecei a trabalhar com arquivos PDFs! Tentei fazer algo que nem sabia como e aí quando desisti, achei a solução pesquisando outras coisas.

    A solução do Guilherme é bem interessante! Vá estudando com ele isso aí, porque eu também irei acompanhando, pois trabalhar com arquivos é algo normal para mim, e essa solução do Guilherme eu ainda não havia tentado!

    Att.

    Giovani

    • Marcado como Resposta Adilson Borges sábado, 25 de maio de 2013 23:35
    terça-feira, 7 de maio de 2013 18:23
  • Tente substituir a função salvar por essa:

    private sub salvar
    
    dim src as string = io.file.readalltext("caminho do arquivo")
    
    src = src.replace(perguntaaleatoria, "#" & perguntaaleatoria)
    
    dim stw as new streamwriter("caminho do arquivo")
    stw.write(src)
    stw.close
    
    end sub
    A diferença é que na outra,ela vai checando linha por linha,já esta usa a função replace.

    • Marcado como Resposta Adilson Borges sábado, 25 de maio de 2013 23:35
    terça-feira, 7 de maio de 2013 21:49

Todas as Respostas

  • Boa tarde!

    Nesse link, vai ensinar você a trabalhar com arquivos. Uma abordagem interessante poderia ser o caso de você ao ler a pergunta, já escrever ela em um novo arquivo, chamado por exemplo de "perguntaslidas.txt", e na posição dessa linha no seu arquivo de leitura, já excluir ela. Assim você só teria 2 arquivos para trabalhar. É só uma sugestão!

    Outra abordagem, se não for possível rescrever a linha selecionada ou até mesmo apagá-la, seria ao você ler uma pergunta, consultar no arquivo de perguntas lidas. Se você não encontrar essa pergunta, adiciona ela ao arquio não lidas e exibe a pergunta no sistema. Caso você encontre ela no arquivo de leitura, você pula para a próxima linha. Essa é outra sugestão!

    Att.

    Giovani

    segunda-feira, 6 de maio de 2013 21:04
  • Para retornar uma linha de um arquivo de texto,você precisa do índice da mesma (normalmente é o número da linha subtraindo 1).Para pegar uma aleatória use a função Random.

    Armazene a pergunta em uma variável para que possa buscar tal no arquvo e escrever o caractere.
    Em outra variável,armazene todo o texto do arquivo.

    Use a função Replace para substituir a pergunta pela mesma,com um caractere desejado para a diferenciação das perguntas já escolhidas e salve.

    Na hora de ler,basta verificar se a pergunta selecionada tem o caractere (Contains).Se tiver,pega uma outra linha aleatória.

    segunda-feira, 6 de maio de 2013 23:33
  • Guilherme,

    Aproveitando, se você puder me passar um exemplo em código. Sei que pode ser abuso, mas estou pedindo isso, porque estou iniciando este projeto como voluntario e ainda não possuo conhecimento necessário para aplicar estas situações.

    Um Abraço

    terça-feira, 7 de maio de 2013 13:23
  • Giovani,

    Gostei da alternativa 1, mas como estou iniciando em Visual, mesmo com o documento, tenho dificuldade em associar ao meu projeto.

    Mas caso o Guilherme consiga me passar um exemplo em código, vou aprender as duas situações e os dois casos são alternativas.

    Obrigado

    terça-feira, 7 de maio de 2013 13:26
  • dim perguntas as string() = io.file.readalllines("caminho do arquivo") 'arquivo com as perguntas (cada pergunta deve estar em uma linha diferente) dim rdn as random = new random() 'variável do tipo random para pegar uma pergunta aleatória dim perguntaaleatoria as string 'variavel para armazenar a pergunta aleatória '--pegar pergunta aleatoria que ainda nao foi escolhida: for pa = 0 to perguntas.length - 1
    dim anum as integer = rnd.next(perguntas.length - 1)

    if not perguntas(anum).startswith("#") then 'se tiver o caractee #,a pergunta já foi escolhida perguntaaleatoria = perguntas(anum) 'pega uma aleatoria exit for 'sai do loop end if next dim srcperguntas as string = "" 'armazenar o texto na variavel srcperguntas for p = 0 to perguntas.length - 1 srcperguntas &= perguntas(p) next msgbox(perguntaaleatoria) 'mensagem com a pergunta aleatória (mude conforme desejar) '------ depois de responder srcperguntas = srcperguntas.replace(perguntaaleatoria, "#" & perguntaaleatoria) 'coloca o caractere # na frente das perguntas escolhidas dim stw as new streamwriter("caminho do arquivo") stw.write(srcperguntas) stw.close


    se não entender,ou não funcionar,basta responder.

    • Editado GuiSantoss terça-feira, 7 de maio de 2013 13:47
    terça-feira, 7 de maio de 2013 13:45
  • Gulherme,

    Já havia consegui uma ajuda na web e estou utilizando a seguinte forma para ler minhas perguntas e respostas. Abaixo o codigo que estou usando. Tentei continuar com o seu na parte de pegar o que esta no label pergunta e substituir no arquivo, mas estou fazendo algo errado.


           
            Dim objDictionary = CreateObject("Scripting.Dictionary")
            
            If lbl_nivel.Text = ("Nível 1") Then
                Dim lines = IO.File.ReadAllLines(Application.StartupPath & "\perg_nv1.txt", System.Text.Encoding.Default)

                Dim i As Int32

                i = 1

                For x As Int32 = 0 To lines.Length - 1
                    If (lines(x).Trim <> "") Then
                        objDictionary.Add(i, lines(x))
                        i = i + 1
                    End If
                Next
            ElseIf lbl_nivel.Text = ("Nível 2") Then
                Dim lines = IO.File.ReadAllLines(Application.StartupPath & "\perg_nv2.txt", System.Text.Encoding.Default)

                Dim i As Int32

                i = 1

                For x As Int32 = 0 To lines.Length - 1
                    If (lines(x).Trim <> "") Then
                        objDictionary.Add(i, lines(x))
                        i = i + 1
                    End If
                Next
            ElseIf lbl_nivel.Text = ("Nível 3") Then
                Dim lines = IO.File.ReadAllLines(Application.StartupPath & "\perg_nv3.txt", System.Text.Encoding.Default)

                Dim i As Int32

                i = 1

                For x As Int32 = 0 To lines.Length - 1
                    If (lines(x).Trim <> "") Then
                        objDictionary.Add(i, lines(x))
                        i = i + 1
                    End If
                Next

            Else
                Dim lines = IO.File.ReadAllLines(Application.StartupPath & "\perg_unica.txt", System.Text.Encoding.Default)

                Dim i As Int32

                i = 1

                For x As Int32 = 0 To lines.Length - 1
                    If (lines(x).Trim <> "") Then
                        objDictionary.Add(i, lines(x))
                        i = i + 1
                    End If
                Next
                
            End If
           

            lbl_pergunta.Text = objDictionary(X)
            lbl_resposta.Text = objDictionary(X + 1)
            X = X + 2

    terça-feira, 7 de maio de 2013 14:22
  • Não precisa usar um dicionário para isso.Vou explicar mais detalhadamente,passo-a-passo.


    1 - Variáveis Globais

    'Local do arquivo onde estão as perguntas dim perguntas as string() = io.file.readalllines("caminho do arquivo") dim rdn as random = new random()

    dim perguntaaleatoria as string

    2 - Função para pegar a pergunta aleatória

    private function obterPerguntaAleatoria as string
    
    dim tp as string
    
    for pa = 0 to perguntas.length - 1
    
    dim indicealeatorio as integer = rnd.next(perguntas.length - 1)
    
    if not perguntas(indicealeatorio).startswith("#") then
    
    tp = perguntas(indicealeatorio)
    perguntaaleatoria = perguntas(indicealeatorio)
    
    exit for
    
    end if
    
    next
    
    return tp
    
    end function

    3 - Usando a função

    label1.text = obterPerguntaAleatoria

    4 - Salvando

    private sub salvar
    
    dim src as string = ""
    
    for s = 0 to perguntas.length - 1
    
    if perguntas(s) = perguntaaleatoria then
    
    perguntas(s) = "#" & perguntaaleatoria
    
    end if
    
    src &= perguntas(s) & vbnewline
    
    next
    
    dim stw as new streamwriter("caminho do arquivo")
    stw.write(src)
    stw.close
    
    end sub

    Acho que deu pra entender.É um jeito simples e eficiente.Qualquer dúvidas,só responder.


    terça-feira, 7 de maio de 2013 15:05
  • Esta gravando uma nova linha com o # e a pergunta "#123" e não acrescentando na linha da pergunta "123". Será o "vbnewline"?
    terça-feira, 7 de maio de 2013 15:41
  • Adilson,

    Todos um dia também foram iniciantes! Você não pode desistir. Se um caminho pelo qual está tentando ir, não está surtindo efeito, tente outro. Se você ficar atolado de vez, pare e vá resolver outro problema de seus projetos, porque quando você se afasta de um problema que você gastou muito tempo para resolver, você consegue ver o quadro de forma completa e assim, encontrar outro caminho para resolver a solução. Eu lembro quando comecei a querer programar e logo em seguida quando comecei a trabalhar com arquivos PDFs! Tentei fazer algo que nem sabia como e aí quando desisti, achei a solução pesquisando outras coisas.

    A solução do Guilherme é bem interessante! Vá estudando com ele isso aí, porque eu também irei acompanhando, pois trabalhar com arquivos é algo normal para mim, e essa solução do Guilherme eu ainda não havia tentado!

    Att.

    Giovani

    • Marcado como Resposta Adilson Borges sábado, 25 de maio de 2013 23:35
    terça-feira, 7 de maio de 2013 18:23
  • Tente substituir a função salvar por essa:

    private sub salvar
    
    dim src as string = io.file.readalltext("caminho do arquivo")
    
    src = src.replace(perguntaaleatoria, "#" & perguntaaleatoria)
    
    dim stw as new streamwriter("caminho do arquivo")
    stw.write(src)
    stw.close
    
    end sub
    A diferença é que na outra,ela vai checando linha por linha,já esta usa a função replace.

    • Marcado como Resposta Adilson Borges sábado, 25 de maio de 2013 23:35
    terça-feira, 7 de maio de 2013 21:49