Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

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

Recommended Posts

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);
}

Share this post


Link to post
Share on other sites
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++;
}					  

Edited by thinkabout

Share this post


Link to post
Share on other sites
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 ...

Edited by waza

Share this post


Link to post
Share on other sites
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)

Edited by thinkabout

Share this post


Link to post
Share on other sites
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;
}

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.