Ir para conteúdo

POWERED BY:

Arquivado

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

gRoOvE

nos argumentos de main()

Recommended Posts

int main(int argc, char* argv[])

{

 

return 0;

}

Gostaria de saber como funcionam esses dois argumentos que vem por padrão na função main.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seja mais objetivo. Qual é a dúvida?

argc armazena o total de argumentos passado pela linha de comando

argv é um vetor de strings que armazena todos os parâmetros (inclusive o nome do programa no índice zero)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou colocar um exemplo:

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

int main(int argc, char *argv[])
{
	FILE *fp;
	char ch;
	
	if(argc != 2)
	{
		printf("Digitar nome do arquivo.\n");
		exit(1);
	}
	
	if((fp = fopen(argv[1],"r")) == NULL)
	{
		printf("Erro ao abrir arquivo.\n");
		exit(1);
	}
	
	ch = getc(fp);
	
	while(!feof(fp))
	{
		putchar(ch);
		ch = getc(fp);
	}
	
	fclose(fp);
	return(0);
}
nesse caso, argc vale 2, pois eu vou entrar com o nome do programa e o nome do arquivo. argv[1] seria o equivalente ao nome do arquivo certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

argv[1] seria o equivalente ao nome do arquivo certo?

Qual arquivo? Você se refere ao arquivo que será aberto ou ao executável?

argv[0] é o nome do programa (executável). argv[1], o do arquivo a ser aberto.

 

 

Para entender melhor, execute:

 

int main(int argc, char *argv[])
{
	int i;
	
	for (i = 0; i < argc; i++)
	{
		printf("argv[%d] = %s\n", i, argv[i]);
	}
	
	return 0;
}

Passe uma lista de parâmetros de qualquer tamanho. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim:

./Programa ARQ_ABERT1 ARQ_ABERT2 ARQ_ABERT3 ...
Já entendi, vlw Beraldo :D

 

Já que estamos falando de e/s por stream, qual a diferença em criar/escrever um/em arquivo texto(w) e arquivo binário(bw)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

bw não, wb. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Um arquivo texto é um arquivo ASCII normal. Legível por humanos.

Um arquivo binário contém os bytes que representam os tipos de dados. Você pode salvar inteiros, estruturas...

 

http://www.google.com/search?ie=UTF-8&...inaries+files+c

Compartilhar este post


Link para o post
Compartilhar em outros sites

hehe, malz =))

entendi o conceito, mas pra compreender a diferença, só na prática msm :D

Só uma coisa, se você da um fopen("TESTE","wb") e entra com uma string nesse arquivo "testando arquivos binarios". A string é toda convertida pra notação binária né?? ou seja, vai ser gravado tudo em zero e um.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Teste este código:

#include <stdio.h>
#include <string.h>

#define ARQ_TXT "teste_txt.bin"
#define ARQ_INT "teste_int.bin"

int main()
{
	char str[] = "Hello World";
	int x = 42;
	FILE *fp = fopen(ARQ_TXT, "wb");
	
	fwrite(str, sizeof(char), strlen(str), fp);
	fclose(fp);
	
	
	fp = fopen(ARQ_INT, "wb");
	fwrite(&x, sizeof(int), 1, fp);
	fclose(fp);
}

A string, mesmo no modo binário, é salva como texto. Já o inteiro, não; só poderá ser lido pelo programa.

 

Sinceramente, não sei por que a string não fica no modo binário. Meus conhecimentos em C ainda são bem limitados. :)

Se eu descobrir a resposta, posto-a aqui, se ninguém responder antes. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, acho que isso é porque o editor de texto que você está usando vai ler os dados do arquivo em uma string, e mostrar em char na tela.

 

Pense bem: o char não é nada mais que um int representando o código do caractere ASCII que ele é.

Por isso, se ao invés de salvar 42 no arquivo, você salvar 85, vai aparecer o U. A string, como já está no formato que o editor de texto lê, vai aparecer do jeito que você salvou. Já o int, como não é uma string, vai ser lido como char no editor de texto e o efeito vai ser o mesmo que um (char)meu_inteiro se não me engano. Talvez não a mesma coisa se você rodar o programa no DOS, porque o DOS parece usar uma lista de caracteres diferente da que usamos no Windows. Mas se você for procurar o seu int em uma lista ASCII online você vai achar o que era pra ser.

 

Acho que tem a ver com isso! Se alguém achar que estou errado me corrija!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha José Enésio, faz sentido isso...mas não ficou claro pra mim. Se você ta salvando em um arquivo que vai usar a notação binária, deveriam ficar lá soh zero e um, ou seja, um monte de código que não deveria ser lido, independente do tipo de dado salvo. Acho que pra responder isso, teriamos que saber como o editor de texto faz a leitura dos dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

00001111

é a mesma coisa que 00 00 11 11

que pode ser também 0000 1111

Não sei agora quanto vale o char, acho que são 2 bytes não lembro, me corrigam quem souber, o que equivale a dois conjuntos de 8 desses bagulhinhos binários.

Se você abrir no seu editor de texto comum, você não vai ver o código binário porque o seu editor de texto lê em char, e mostra em char. Se você pegar um editor hexadecimal ele vai abrir e mostrar os inteiros em hexadecimal. Não tem nada no arquivo que simplesmente diga que não é pra ler como texto. Texto também é formado por binários, então se é um ou outro não faz diferença. O que muda é quem vai ler.

Acho que se você pegar alguns números quebrados, tipo, digamos que char é 2 bytes e algum outro tipo é 1 byte, então você salva um desses 1 byte antes de gravar o texto, aí acredito que o editor vai enlouquecer e não vai mostrar seu texto :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que o José pediu: o char ocupa um byte, tanto é que possui os valores de -128 a 127 (ou seja, 2^8 números). Bom, também tenho conhecimentos limitados, mas acredito que a idéia é a seguinte:

 

Como disse, um char é representado por apenas um byte. Um byte contém 8 bits. Um bit possui dois valores 0 e 1. Assim, um byte terá 2^8 valores possíveis. No caso do int, temos (na maioria das vezes) 4 bytes que o representam. Assim, o int pode ter (2^8)x(2^8)x(2^8)x(2^8) = 2^32 valores diferentes. Como cada byte contém 256 valores diferentes, podemos representá-lo por valores de 0000 0000 até 1111 1111 ou hexadecimalmente de 00 até FF.

 

Voltando aos arquivos: quando pedimos para ele gravar o char 'a' no arquivo, ele na verdade grava o código desse char (97 no meu windows) em binário 0110 0001. Agora, se pedirmos para ele gravar um int = 97 ele irá gravar: 0110 0001, 0000 0000 , 0000 0000 , 0000 0000 (a vírgula é para separar os bytes). Um interpretador de texto puro (o bloco de notas, por exemplo), ao ler o arquivo no qual foi gravado o char, ele interpretará o valor 0110 0001 como correspondente ao a, e irá mostrá-lo na tela normalmente. Agora, ao abrir o segundo arquivo (o do int) com o bloco de notas, ele também enxergará o primeiro byte como o 'a', já que é o código dele mesmo. O resto em branco ele acaba interpretando como um espaço.

 

Para não ficar só no texto, execute o exemplo do Beraldo com uma pequena modificação:

#include <stdio.h>

#define ARQ_TXT "teste_txt.txt"
#define ARQ_INT "teste_int.txt"

int main()
{
	char str = 'a';
	int x = 97;
	FILE *fp = fopen(ARQ_TXT, "wb");
	
	fwrite(&str, sizeof(char), 1, fp);
	fclose(fp);
	
	
	fp = fopen(ARQ_INT, "wb");
	fwrite(&x, sizeof(int), 1, fp);
	fclose(fp);
}

Agora, no arquivo teste_txt.txt você vai encontrar um a normal. E no arquivo teste_int.txt você também vai encontrar o mesmo a e um espaço do lado. Esses espaços são a interpretação daqueles 3 bytes 'vazios' que o bloco de notas faz, mas na verdade o código do espaço é 0010 0000.

 

O que acontece é que de vez em quando (ou freqüentemente) você grava números que não possuem um caractere correspondente, ou possuem um mas é um daqueles esdrúxulos.

 

Resumo da ópera: o C sempre vai gravar seus valores em bytes (aliás, o computador sempre fez isso..) e, dependendo de quem for ler, esses bytes terão uma interpretação diferente.

 

Agora eu que pergunto pra vocês: qual é a diferença então entre o 'w' e o 'wb' ?

 

Falou!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Agora eu que pergunto pra vocês: qual é a diferença então entre o 'w' e o 'wb' ?

 

Aqui, teoricamente, nenhuma:

 

The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding 'b' may be a good ideia if you do I/O to a binary file and expect that your program may be ported to a non-Unix environment).

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso ai msm Antonio, tudo depende de como o byte vai ser lido, no caso o bloco de notas só le código ASCII, por isso se meter um byte do tipo int lá ele(o bloco de notas) vai ficar perdidin :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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