Ir para conteúdo
Fórum Script Brasil
  • 0

Não To Entendendo


rodfraga

Pergunta

Galera, eu fiz um programa que abre um arquivo, lê e separa por linhas, botando em um vector. Então ele imprime na tela. Porém, ele insiste em dar o output "(null)

(null)"

Olhem o código:

#include <iostream.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <vector>
#include <stdio.h>
int main()
{
    ifstream arq;
    vector<char *> linhas;
    char *texto;
    char *aux=NULL;
    int x=0;
    long nlinhas=1;
    char *delim = "\n";
    char *fnome;
    cout << "Digite o nome do arquivo." << endl;
    gets(fnome);
    arq.open(fnome);
    while (arq.get(texto[x])){
          x++;
    }
    arq.close();
    aux = strtok(texto, delim);
    while (aux!=NULL){
          linhas.push_back();
          aux = strtok(NULL, delim);
    }
    for (int x=0; x<=strlen(texto); x++){
        if (texto[x]=='\n'){
           nlinhas++;
        }
    }
    for (int x=0; x<=nlinhas; x++){
        cout << linhas[x] << '\n' << endl;
    }
    system("PAUSE");
    return 0;
}

Onde está o erro? Será que eu estou errando ao ler o arquivo?

Obrigado

Rodrigo

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

Bom, pelo que vi aqui o problema é que push_back() precisa de um argumento que é justamente o que deve ser inserido no vetor. Ou seja, a linha...

linhas.push_back();
... vira:
linhas.push_back(aux);
Agora, qual compilador você está usando que não gerou esse erro? Aqui no BCC 5.5 ele não compilou por causa disso. Outro problema é que...
char *texto;
... deveria ser algo do tipo:
char texto[2000];

Ou seja, definindo o tamanho. Caso contrário, dá um erro de operação ilegal e tudo! biggrin.gif Porém, acredito que deva haver uma forma de redimensionar esse vetor (seria o malloc()?), mas realmente desconheço essa parte.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

A parte do array definido, pode-se, em C criar ponteiros para não precisar definir o tamanho(pelo que me disseram e dá certo).

Bem agora(valeu por ver aquele erro. Cara, eu leio o código mas não vejo erros nítidos), ele imprime duas carinhas na tela e escreve depois "(NULL)"

dry.gif

E olha que no arquivo texto está escrito

oi

eu

sou

o

rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

A parte do array definido, pode-se, em C criar ponteiros para não precisar definir o tamanho(pelo que me disseram e dá certo).

Sim, mas só se você fizer algo do tipo:

char *texto = "teste";

Caso contrário, é necessário utilizar uma função que redimensiona o vetor (que, se não me engano, é uma chamada malloc(); alguém aqui desse fórum, como o Wicker ou o Bono, deve poder esclarecer isso pra gente).

Bem agora(valeu por ver aquele erro. Cara, eu leio o código mas não vejo erros nítidos), ele imprime duas carinhas na tela e escreve depois "(NULL)"

dry.gif

E olha que no arquivo texto está escrito

oi

eu

sou

o

rodrigo

Mas, o compilador deixava compilar normal? Qual compilador você usa?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, claro que pode:

    char *texto = "teste";
    texto = "ttt12";

Porém, você só tem 6 bytes neste vetor e é perigoso colocar mais do que isso. Lembre-se que em C não existe uma checagem se o quanto que você quer colocar realmente cabe. Pode ser que você insira 20, 30 bytes neste vetor e não dê problema.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

É eu estou nessa dúvida. Por exemplo, eu quero fazer um método que separe uma string por caracteres '.' e cheque se o primeiro caracter de cada frase está em letra maiúscula, se sim, retorna 1 se não, 0.

Esse é um exemplo.

Como eu teria que declarar a str principal?

char *str;

?

é essa a dúvida. Como fazer para funcionar corretamente mas sem ficar preso a um número mínimo de caracteres.

Parece que pelo menos no aspecto de armazenamento, as strings de C++ dão de 10 nas de C em relação a facilidade para o desenvolvedor.

Obrigado

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

Não... acho que eu estava errado. Testei isso aqui...

#include <stdio>
#include <string>

void main() {
    char *texto = "teste";
    strcpy(texto, "ttt2askdjakadjkajadlzxkjlzxklzklzklzkkjad");
    printf("%s\n", texto);

    char texto2[6] = "teste";
    strcpy(texto2, "ttt2askdjakadjkajadlzxkjlzxklzklzklzkkjad");
    printf("%s\n", texto2);
}

E só dá problema no segundo exemplo, onde explicito o tamanho do vetor. No primeiro caso, como é um ponteiro, acho que a alocação é feita em qualquer lugar da memória e "texto" passa apenas a apontar para o endereço (assim como no segundo exemplo, porém neste o tamanho está explícito).

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
É eu estou nessa dúvida. Por exemplo, eu quero fazer um método que separe uma string por caracteres '.' e cheque se o primeiro caracter de cada frase está em letra maiúscula, se sim, retorna 1 se não, 0.

Esse é um exemplo.

Como eu teria que declarar a str principal?

char *str;

?

é essa a dúvida. Como fazer para funcionar corretamente mas sem ficar preso a um número mínimo de caracteres.

Parece que pelo menos no aspecto de armazenamento, as strings de C++ dão de 10 nas de C em relação a facilidade para o desenvolvedor.

Obrigado

Rodrigo

Sim, como uma string em C é um vetor de chars, você sempre tem que passar um ponteiro do mesmo para a função.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Então por quê no seguinte código, ele não bota o texto do arquivo texto na variável texto?:

#include <iostream.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <vector>
int main()
{
    ifstream arq;
    vector<char *> linhas;
    char *texto="texto";
    char *aux;
    int x=0;
    long nlinhas=1;
    char *delim = "\n";
    char *fnome;
    cout << "Digite o nome do arquivo." << endl;
    cin >> fnome;
    arq.open(fnome);
    while (arq.get(texto[x])){
          x++;
    }
    arq.close();
    aux = strtok(texto, delim);
    while (aux!=NULL){
          linhas.push_back(aux);
          aux = strtok(NULL, delim);
    }
    for (int x=0; x<=strlen(texto); x++){
        if (texto[x]=='\n'){
           nlinhas++;
        }
    }
    for (int x=0; x<=nlinhas; x++){
        cout << linhas[x] << '\n' << endl;
    }
    system("PAUSE");
    return 0;
}

E retorna "texto

(null)"

?

Obrigado

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que assim o código fica mais elegante.

Se você já está usando a classe fstream, por que não utilizar todos os recursos dela? Dê uma olhada no código e veja como eu capturei o conteudo do arquivo pra variavel buffer. wink.gif

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main() {
    filebuf *pbuf;
    ifstream filestr;
    long size;
    char *buffer;
    int linhas = 0;
    
    // abre o arquivo
    filestr.open("teste.txt");
    
    // pega o ponteiro associado ao buffer
    pbuf = filestr.rdbuf();
    
    // pega o tamanho do arquivo
    size = pbuf->pubseekoff(0, ios::end, ios::in);
    pbuf->pubseekpos(0,ios::in);
    
    // aloca a memoria e pega os dados
    buffer = new char[size];
    pbuf->sgetn(buffer, size);
    filestr.close();
    
    // cria a string e a separa, para depois armazenar no vetor
    vector<string> partes;
    char *aux = strtok(buffer, "\n");
    while (aux!=NULL){
        partes.push_back(aux);
        aux = strtok(NULL, "\n");
        linhas++;
    }
    
    // escreve na tela
    for(register int i=0; i<linhas; i++)
        cout << "(" << i << ") " << partes.at(i) << endl;
    
    return 0;
} 

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado, iSoron, entendi o código. Porém, nessas partes:

// pega o tamanho do arquivo
   size = pbuf->pubseekoff(0, ios::end, ios::in);
   pbuf->pubseekpos(0,ios::in);
e
// aloca a memoria e pega os dados
   buffer = new char[size];
   pbuf->sgetn(buffer, size);
   filestr.close();

Na primeira, eu não entendi direito a terceira linha e você poderia me explicar melhor a pubseekoff e seus parâmentros, ou aonde eu possa ler sobre?

Na segunda linha você pega o tamanho, mas e na terceira?

Na segunda parte de código, você, na segunda linha cria um array de chars do tamanho size, mas e na terceira linha? E o que é a sgetn?

Onde posso ler sobre o que não entendi, ou você pode me explicar?

Obrigado ao dois

Rodrigo

Link para o comentário
Compartilhar em outros sites

  • 0

o método pubseekoff recebe três parametros:

pubseekoff(off, way, cursor)

A partir da posição "way", que pode ser inicio, fim, ou local atual, mova o "cursor", que pode ser o de entrada ou o de saida, "off" casas, onde "off" é um inteiro.

way
  ios::beg - inicio
  ios::end - fim
  ios::cur - atual

cursor
  ios::in  - cursor de entrada
  ios::out - cursor de leitura

retorna a posição do cursor

Ou seja, a partir do final, eu pedi pra ele andar 0 casas e me retornar a posição atual. Isso, obviamente, vai retornar o tamanho total do texto.

A diferença do pubseekoff pra o pubseekpos é que o primeiro é a posição relativa, enquanto o segundo, a posição absoluta. Então, não precisa especificar se é contando a partir do inicio, do fim, ou da posição atual. Na linha do pubseekpos, eu voltei o cursor pra posição inicial, pra não perder nada do texto.

Na parte do sgetn, eu mandei ele ler size letras e gravar no buffer.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...