Ir ao conteúdo

Posts recomendados

Postado

Vai escrever isso em que linguagem? C, C++ ou C#?

Qual sua dúvida? Sabe ao menos abrir o arquivo e ver o que tem dentro?

 

Poste o arquivo aqui. Porque fazer alguém que quer te ajudar deixar o forum, baixar um arquivo desconhecido, abrir em outro programa, voltar ao forum????

 

Não é muito melhor para quem quer te ajudar ler isso aqui:
 

NOME: EI123
COMENTARIO: valor: 569
DIMENSAO: 23 
CAPACIDADE: 4500 
CLIENTE_X_Y
1 266 235 
2 295 272
3 301 258
4 309 260
5 217 274
6 218 278
...

 

Se quer ler a 3a e a 4a linha e mais as coordenadas que estão a partir da 6a... Apenas leia as linhas de que não precisa e ignore. Pode usar qualquer técnica, como por exemplo ler o número certo de '\n' que como deve saber indica o final de uma linha.

 

Ou em C por exemplo usar fgets() que lê uma linha toda.

 

Para ler os campos pode separar as palavras e usar funções de conversão.

 

Claro, se usa C ou C++ pode usar fscanf() que foi escrita para isso: ler dados tabulares --- scan formatted quer dizer isso.

 

 

  • Curtir 1
Postado
2 horas atrás, arfneto disse:

Vai escrever isso em que linguagem? C, C++ ou C#?

Qual sua dúvida? Sabe ao menos abrir o arquivo e ver o que tem dentro?

 

Poste o arquivo aqui. Porque fazer alguém que quer te ajudar deixar o forum, baixar um arquivo desconhecido, abrir em outro programa, voltar ao forum????

 

Não é muito melhor para quem quer te ajudar ler isso aqui:
 

NOME: EI123
COMENTARIO: valor: 569
DIMENSAO: 23 
CAPACIDADE: 4500 
CLIENTE_X_Y
1 266 235 
2 295 272
3 301 258
4 309 260
5 217 274
6 218 278
...

 

Se quer ler a 3a e a 4a linha e mais as coordenadas que estão a partir da 6a... Apenas leia as linhas de que não precisa e ignore. Pode usar qualquer técnica, como por exemplo ler o número certo de '\n' que como deve saber indica o final de uma linha.

 

Ou em C por exemplo usar fgets() que lê uma linha toda.

 

Para ler os campos pode separar as palavras e usar funções de conversão.

 

Claro, se usa C ou C++ pode usar fscanf() que foi escrita para isso: ler dados tabulares --- scan formatted quer dizer isso.

 

 

Então, vou postar o código aqui que estou usando para ler o arquivo. Estou utilizando o c++ para escrever o código. A minha dúvida é, o q eu posso fazer, para ler o números no final da linha. 

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main () {
    ifstream f;
    f = ifstream("instancia.txt");


    string linha;
    int dimen;
    int capacidade;

 

    //verificar se o arquivo
    if(!f.is_open())
        cout << "Erro ao abrir o arquivo!" << endl;

    //lendo os dados
    getline(f, linha);
    getline(f, linha); 
    getline(f, linha);  // <======== tenho que extrair o inteiro do final dessa linha para atribuir a var dimen
    getline(f, linha);  // <======== tenho que extrair o inteiro do final dessa linha para atribuir a var capacidade
    getline(f, linha); 

 

    //Leitura da matriz
    int mat_cord[dimen][3];
    for(int i=0; i<dimen; i++){
        for(int j=0; j<3; j++){
            f >> mat_cord[i][j];
        }
    }

    return 0;
}

 

Como que eu posso separar o que estou pegando no getline do texto e do valor que eu quero ? 
OBS: Coloquei aqui o código, mas são soube como colocar o texto em formato de código igual colocou na resposta. 

 

Postado
42 minutos atrás, unknown shark disse:

Como que eu posso separar o que estou pegando no getline do texto e do valor que eu quero ? 

 

Eu te disse uma maneira ao menos: use fscanf()

 

42 minutos atrás, unknown shark disse:

//Leitura da matriz
    int mat_cord[dimen][3];
    for(int i=0; i<dimen; i++){
        for(int j=0; j<3; j++){
            f >> mat_cord[i][j];
        }
    }

 

porque não le uma linha por vez? Não é mais legível?

 

E precisa ler também o primeiro valor, mas não precisa represent-a-lo na matriz. Qual seria o propósito? O valor de le vai ser o número da linha afinal

 

42 minutos atrás, unknown shark disse:

getline(f, linha); 
    getline(f, linha);  // <======== tenho que extrair o inteiro do final dessa linha para atribuir a var dimen
    getline(f, linha);  // <======== tenho que extrair o inteiro do final dessa linha para atribuir a var capacidade
    getline(f, linha); 

 

Porque não mostra o que leu, ao menos para se sentir seguro?

 

42 minutos atrás, unknown shark disse:

mas são soube como colocar o texto em formato de código igual colocou na resposta

 

Use o botão code como está explicado no primeiro tópico do forum. Deste forum.

 

 

Você postou um programa em C praticamente... Use C++. A linguagem é mais fácil para representar coisas. E muito mais poderosa.

 

    int dimen;
  
//..
    //Leitura da matriz
    int mat_cord[dimen][3];

 

Não pode fazer isso nessa linguagem, ao menos não pelo padrão. A dimensão tem que ser constante, como em C.

 

Porque não usa um vetor? É C++ ...

Postado

Uma maneira comum de ler isso seria copiar todos os pontos para um vetor de coordenadas, depois de identificar dimensão e capacidade.

 

Uma saída de um programa desses poderia ser

 

Dimensao = 23 Capacidade = 4500 Pontos lidos: 23
Coordenadas:
(266,235)
(295,272)
(301,258)
(309,260)
(217,274)
(218,278)
(282,267)
(242,249)
(230,262)
(249,268)
(256,267)
(265,257)
(267,242)
(259,265)
(315,233)
(329,252)
(318,252)
(329,224)
(267,213)
(275,192)
(303,201)
(208,217)
(326,181)

 

Com o que foi lido do arquivo. No vetor cada posição tem o par (x,y).

 

Um exemplo em C++

 

#define ST_COORD 7  // inicio da linha
#include <algorithm>
#include <fstream>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

// ARFNeto '21
int main(void)
{
    vector<pair<int, int>> ponto;
    auto                   capacidade = 0;
    auto                   dimensao   = 0;
    auto                   estado     = 0;
    auto                   coord      = make_pair(0, 0);
    auto                   maquina    = [&](auto& str) -> void
    {
        switch (estado)
        {
            case 0:
                if (str == "DIMENSAO:") estado = 1;
                break;
            case 1:
                dimensao = atoi(str.c_str());
                estado   = 2;
                break;
            case 2:
                if (str == "CAPACIDADE:") estado = 3;
                break;
            case 3:
                capacidade = atoi(str.c_str());
                estado     = 4;
                break;
            case 4:
                if (str == "1") estado = 5;
                break;
            case 5:  // le primeira coordenada
                coord.first = atoi(str.c_str());
                estado      = 6;
                break;
            case 6:  // le a segunda coordenada
                coord.second = atoi(str.c_str());
                ponto.push_back(coord);  // leu um par
                estado = 7;
                break;
            case 7:  // numero da coordenada: ignora
                estado = 5;
                break;
        };  // switch()
    };
    ifstream                 f{"instancia.txt"};
    istream_iterator<string> iis{f}, fim{};
    for_each(iis, fim, maquina);
    cout << "Dimensao = " << dimensao
        << " Capacidade = " << capacidade
        << " Pontos lidos: " << ponto.size()
        << "\nCoordenadas: \n";
    auto mostra = [](auto& p)
    { cout << "(" << p.first << "," << p.second << ")\n"; };
    for_each(ponto.begin(), ponto.end(), mostra);
    return 0;
}
// https://www.clubedohardware.com.br/forums/topic/1567912-como-ler-um-inteiro-de-uma
//-linha-espec%C3%ADfica-de-um-arquivotxt-usando-c/

 

A lógica é bem ingênua: uma máquina de estados com um único comando, o switch() que extrai os dados.

 

Em C++20 o último for_each podia usar ranges e ficar como

 

    ranges::for_each(std::views::all(ponto), mostra);    

 

O resultado claro seria o mesmo.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!