Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sownten

Problema de fgets na leitura de um arquivo

Recommended Posts

Boa noite, estou tentando fazer uma funcao que le o nome e a nota de individuos e descobre qual é a maior nota entre eles. Como podem ver eu chamo a funcao fgets, guardo nas variaveis o nome em nome1 e a nota em n1 e só depois entro no while. Mas acontece algo bem bizarro, quando eu chamo fgets dentro do while, a variavel nome1 é substituida pela linha inteira que o fgets lê.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80

 

int comparar_notas ()

{

int n1,n2;
char *nome2,*nome1;
char buf[MAX];
FILE *arq;

arq = fopen("arquivo.txt", "r");
if(arq == NULL)
{
printf("Erro ao abrir o arquivo\n");
return;
}
fgets(buf, MAX, arq);
nome1 = strtok(buf,",");
n1 = atoi(strtok(NULL,","));


while(!feof(arq))
{
fgets(buf, MAX, arq);
nome2 = strtok(buf,",");
n2 = atoi(strtok(NULL,","));
if (n1<n2)
{
n1=n2;
nome1=nome2;
}

}
printf("%s,%d",nome1,n1);

}

int main ()

{

comparar_notas();

return 0;

}

 

segue ai o q esta escrito no arquivo

 

Adamastor,66
Alaor,28
Aldebaran,88
Arlinda,19
Austeclynio,22
Claudinei,60
Domitila,62
Enderson,44
Guilhermina,33
Milena,72
Reginaldo,50
Tula,99
Zoraide,77

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu testei aqui e só to conseguindo mostrar as duas maiores notas, só coloquei o printf dentro do if do while... Mas n to entendendo o pq dele colocar o nome errado do jeito q você fez

if (n1<n2)
{
n1=n2;
nome1=nome2;
printf("%s,%d\n",nome1,n1);
}
EDIT
Fazendo uma gambiarra bem feia, consegui o resultado... Mas vou ficar tentando aqui pra poder te ajudar
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80

int comparar_notas ()
{
int n1,n2,cont=0;
    char *nome2,*nome1,*nome3;
    char buf[MAX];
    FILE *arq;

    arq = fopen("arq.txt", "r");
    if(arq == NULL)
    {
        printf("Erro ao abrir o arquivo\n");
        return;
    }
    fgets(buf, MAX, arq);
    nome1 = strtok(buf,",");
    n1 = atoi(strtok(NULL,","));


    while(!feof(arq))
    {
        fgets(buf, MAX, arq);
        nome2 = strtok(buf,",");
        n2 = atoi(strtok(NULL,","));
        if (n1<n2)
        {
            cont++;
            n1=n2;
            nome1=nome2;
            if(cont==2){
            printf("%s,%d\n",nome1,n1);}
        }
    }
}int main ()
{
   comparar_notas();
   return 0;
}


Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entedi porque você criou uma função inteira que não retorna nem um valor, então coloquei ela para o tipo void mesmo.

O problema esta resolvido ~^-^~;

 

Script:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 80
 
void comparar_notas ()
{
 
int notaCORRENTE, notaMAXIMA;
char *nomeCORRENTE;
static char buffer[MAX] = "", alunonMAXIMA[MAX] = "";
 
notaCORRENTE = notaMAXIMA = 0;
nomeCORRENTE = NULL;
 
FILE *arq = fopen("arquivo.txt", "r");
if(arq == NULL)
{
    printf("Erro ao abrir o arquivo\n");
    return ;
}
 
while(!feof(arq))
{
    //Capturando linhas:
    fgets(buffer, MAX, arq);
 
    //Trocando ',' por zero:
    nomeCORRENTE = strtok(buffer,","); //Nesse momento a função strtok() coloca um caracter nulo no lugar da vírgula, e pega o que tem antes dele, token;
    buffer[strlen(buffer)] = '0'; //colocamos 0 no lugar deste caracter nulo para que possamos trabalhar normalmente com a função strstr() e que possamos trabahar com a conversão de tipos;
 
    //Capturando nota; coversão de tipos:
    notaCORRENTE =  atoi(strstr(buffer,"0")); //Ira pegar o conteudo desde do zero ate '\0';
 
    //Capturando nome:
    nomeCORRENTE = strtok(buffer,"0"); //Como foi trocado ',' por 0 fazemos dessa forma para pegar somente o nome; -_-# ponteiros kkkk
 
    if (notaCORRENTE > notaMAXIMA)
    {
        notaMAXIMA = notaCORRENTE;
        memset(alunonMAXIMA,0,MAX);
        strcpy(alunonMAXIMA,nomeCORRENTE);
    }
 
}
fclose(arq);
 
printf("Aluno(a) nota maxima: %s\nNota: %i\n",alunonMAXIMA, notaMAXIMA);
 
}
int main ()
{
   comparar_notas();
   return 0;
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera.
      Espero que todos estejam bem.
      Seguinte: Tenho um arquivo xml onde alguns campos estão com : (dois pontos), como o exemplo abaixo:
       
      <item>
      <title>
      d sa dsad sad sadasdas
      </title>
      <link>
      dsadas dsa sad asd as dsada
      </link>
      <pubDate>sadasdasdsa as</pubDate>
      <dc:creator>
      d sad sad sa ad as das
      </dc:creator>
      </item>
       
      Meu código:
       
      $link = "noticias.xml"; 
      $xml = simplexml_load_file($link); 
      foreach($xml -> channel as $ite) {     
           $titulo = $ite -> item->title;
           $urltitulo = $ite -> item->link;
           print $urltitulo = $ite -> item->dc:creator;
      } //fim do foreach
      ?>
       
      Esse campo dc:creator eu não consigo ler. Como faço?
       
      Agradeço quem puder me ajudar.
       
      Abs
       
       
    • Por Ane_
      Olá gente.
       
      Não consigo abrir o arquivo de desenvolvimento de um aplicativo,
      que foi feito pela themeforest(o template).
      Será que ele não é compatível com as IDE's que eu tô tentando abrir, já tentei no:
       
      Notepad++ Visual Studio (Com o ionic instalado) Android Studio  
      Esse é um dos erros que aparecem:
       
      "the archive not is displayed in the editor because it is either binary or uses unsupported text encoding"
       
    • Por vinihhylian0103
      É possível anexar um arquivo e enviá-lo por email via PHP? Se sim, alguém poderia me dar uma ajuda com isso por favor, é realmente muito importante para meu projeto do TCC.
    • Por felipems98
      Olá, esse e meu primeiro post no forum, estou com problema para manipular dados recebidos de um arquivo
      Eu quero capturar esses dados e salvar em um variavel, podem com o fgets() eu so consigo printar na tela pois quando vai passar pra outra variavel ele so pega o ultimo caracter.
      Segue a baixo o codigo:
      void main(){ FILE *pont_arquivo; char caminho[100]; char tx[100]; //char c; char texto[100]; int i; //define e abre o arquivo que será formatado printf("coloque o caminho do arquivo que queira abrir\n"); gets(caminho); pont_arquivo = fopen(caminho, "r"); if (pont_arquivo == NULL){ printf ("ERRO: arquivo não encontrado ou sem permissão de acesso.\n"); exit(0); } printf("arquivo aberto.\n"); while(fgets(tx, 100, pont_arquivo) != NULL){ for( i=0; i< sizeof(tx); i++) texto[i] = tx[i]; } fclose(pont_arquivo); printf("%s", texto); } O print consegue retornar todos os valores do arquivo mas não consigo passar eles para uma variável e tratar dentro do código.
      ja tentei com strcpy e esse exemplo eu mandei com for pra atribuir um a um os dados, mas não consegui com nenhum dos dois.
      A baixo tem os dados do arquivo txt:
      teste{ sjdoasijd,xy jsioadja,xy jsiadj,xy ois,xy djsia,xy dijodajsi,xy jiosjodia,xy jbf23,xy 21,xy 21983,xy moisdoia,xy mh8293,xy ajksnd,xy ioaasd,xy }  
    • Por Gustavo2503
      fgets() não funciona em xml versão 4.00, só funciona na versão 3.10
      $arquivo = $_FILES['arquivo']["tmp_name"]; $xml = fopen($arquivo, 'r'); while(!feof($xml)){ $linha = fgets($xml); if (!$linha){ $linha = "Erro"; } } echo $linha; Ele retorna "Erro" quando o xml está na versão 4.00. Como arruma isso?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.