gRoOvE 0 Denunciar post Postado Outubro 20, 2008 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
Beraldo 864 Denunciar post Postado Outubro 21, 2008 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
gRoOvE 0 Denunciar post Postado Outubro 21, 2008 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
Beraldo 864 Denunciar post Postado Outubro 21, 2008 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
gRoOvE 0 Denunciar post Postado Outubro 22, 2008 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
Beraldo 864 Denunciar post Postado Outubro 23, 2008 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
gRoOvE 0 Denunciar post Postado Outubro 26, 2008 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
Beraldo 864 Denunciar post Postado Outubro 26, 2008 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
José Enésio 4 Denunciar post Postado Outubro 26, 2008 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
gRoOvE 0 Denunciar post Postado Novembro 1, 2008 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
José Enésio 4 Denunciar post Postado Novembro 5, 2008 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
Antoniosp 2 Denunciar post Postado Novembro 5, 2008 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
_Isis_ 202 Denunciar post Postado Novembro 5, 2008 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
gRoOvE 0 Denunciar post Postado Novembro 8, 2008 É 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