Ir para o conteúdo
thinkabout

Escrever no monitor determinada linha de um ficheiro. Passado como argumento

Mensagens Recomendadas

thinkabout    0
thinkabout

Penso que o que é pedido é que meta a sintaxe pela a CMD.

Mas não consigo comparar.

if (nrlinhas == (int)argv[2]) // <-- Como posso comparar um char com um inteiro ?

Segue em baixo o código completo.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
Ex4.
Desenvolva uma função que escreva no monitor uma determinada linha de um ficheiro de
texto. O nome do ficheiro e o número da linha são passados como argumentos da função.
*/
void main(int argc, char*argv[])
{
int nrlinhas=0; // Variável que vou usar para saber quando imprimir
char linha [100]; // Onde vou por a linha que quero imprimir
FILE *original;
/* Testar a Linha de Comando */
if (argc!=3)
{
printf("Sintaxe: \n\n%s Origem Nr da linha\n\n",argv[0]);
exit(1); /*Termina o Programa*/
}
original=fopen(argv[1],"r"); // Abrir o ficheiro para leitura.
if (original == NULL)
{
printf("Erro de abertura do ficheiro\n");
exit(2);
}
while (fgets(linha, 100, original) != NULL)
{
// fgets -> A onde vai ser armezenada a string lida, quantos caracteres vou ler, de onde vou ler.
if (nrlinhas == (int)argv[2]) // <-- Como posso comparar um char com um inteiro ?
{
printf("%s", linha);
}
nrlinhas++;
}			 
fclose(original);
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thinkabout    0
thinkabout

Usei a função atoi, aconselham outras formas ?

nrdelinhasuser = atoi(argv[2]);

while (fgets(linha, 100, original) != NULL)
{
// fgets -> A onde vai ser armezenada a string lida, quantos caracteres vou ler, de onde vou ler.
if (nrlinhas == nrdelinhasuser) // <-- Como posso comparar um char com um inteiro ?
{
printf("%s", linha);
}
nrlinhas++;
}					  

Editado por thinkabout

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
waza    1
waza

#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[])
{

	int nrlinhas=0; // Variável que vou usar para saber quando imprimir
	char linha [100]; // Onde vou por a linha que quero imprimir
	FILE *original;
	/* Testar a Linha de Comando */
	if (argc!=3)
	{
		printf("Sintaxe: \n\n%s Origem Nr da linha\n\n",argv[0]);
		exit(1); /*Termina o Programa*/
	}

	if ( (original=fopen(argv[1],"r"))== NULL )
	{
		printf("Erro de abertura do ficheiro\n");
		exit(2);
	}

	while (fgets(linha, 100, original) != NULL)
		if (atoi(argv[2]) == ++nrlinhas)
		{
			printf("%s", linha);
			break;
		}


	fclose(original);
return 0;
}

assim funciona-me aqui ...

Editado por waza

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thinkabout    0
thinkabout

falhou-me o break; ;) também já o meti a bombar

E modifiquei o fgets com o sizeof para ser mais genérico

 while (fgets(linha, sizeof linha, original) != NULL)

Humm...

Não conhecia que podia fazer isto.

if (atoi(argv[2]) == ++nrlinhas)

Editado por thinkabout

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

a primeira coisa que deverás fazer é sempre a verificação dos dados, só depois é que deverás fazer o que tens a fazer:

(usei uma outra solução de leitura do inteiro só para questões de conhecimento)

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[])
{
 int i = 0, nlinha = 0;
 char linha[100] = {0};
 FILE * fd;

 if (argc!=3)
 {
   printf("Sintaxe: \n\n%s <nome_ficheiro> <n_linha>\n\n", argv[0]);
   exit(1);
 }

 if (sscanf(argv[2], "%d", &nlinha) != 1 || nlinha == 0)
 {
   printf("ERRO : Numero de linha invalido");
   exit(2);
 }

 if ((fd = fopen(argv[1], "r")) == NULL)
 {
   printf("ERRO : Erro de abertura do ficheiro\n");
   exit(3);
 }

 // a ordem das comparações é importante !!!
 // nota que as linhas do ficheiro são contabilizadas de 1 para N
 while (i != nlinha &&
        fgets(linha, 100, fd) != NULL)
 {
   i++;
 }

 if (i != nlinha)
 {
   printf("ERRO : Ficheiro insuficientemente pequeno\n");
   exit(4);
 }

 printf("%s", linha); // ja deverá ter o '\n' do fgets          

 fclose(fd);
 return 0;
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.