Olá, estou com um problema.
Segui as recomendações do enunciado p/ a abertura dos arquivos de entrada e saída mas, ao contrário do que está escrito lá, quando não digito nada (dou Enter de cara) ele não lê da stdin, simplesmente diz que o "arquivo não foi encontrado".
No Windows eu consegui corrigir isso mudando a comparação, de nome_arq_entrada[0] == '\0' para nome_arq_entrada[0] == '\n', mas no Linux não está adiantando...
Seria um problema enviar o código assim mesmo? Afinal, estou seguindo as recomendações pedidas à risca... Não sei se o problema é com o meu terminal por exemplo.
Obrigado!
André
No Linux eu fiz isso e parece que esta funcionando.
/* Leitura do nome do arquivo de entrada */
printf("Digite o nome do arquivo de entrada: ");
fgets(buffer, MAX_NOME_ARQ, stdin);
nome_arq_entrada[0] = '\0'; /* <<< linha adicionada por mim */
sscanf(buffer, "%s", nome_arq_entrada);
printf("<%d><%d>",buffer[0],nome_arq_entrada[0]);
/* Leitura do nome do arquivo de saida */
printf("Digite o nome do arquivo de saida: ");
fgets(buffer, MAX_NOME_ARQ, stdin);
nome_arq_saida[0] = '\0'; /* <<< linha adicionada por mim */
sscanf(buffer, "%s", nome_arq_saida);
/* Leitura do nome do arquivo de entrada */
printf("Digite o nome do arquivo de entrada: ");
fgets(buffer, MAX_NOME_ARQ, stdin);
nome_arq_entrada[0] = '\0'; /* <<< linha adicionada por mim */
sscanf(buffer, "%s", nome_arq_entrada);
printf("<%d><%d>",buffer[0],nome_arq_entrada[0]);
/* Leitura do nome do arquivo de saida */
printf("Digite o nome do arquivo de saida: ");
fgets(buffer, MAX_NOME_ARQ, stdin);
nome_arq_saida[0] = '\0'; /* <<< linha adicionada por mim */
sscanf(buffer, "%s", nome_arq_saida);
Eu tinha testado o fragmento de código do enunciado e ele funcionava... Acontece que eu fiz esse teste com a versão 4.2.4 do gcc para Linux. Agora testei com uma versão mais recente do gcc (a versão 4.3.3) e vi o mesmo problema que você, André. Aparentemente entre essas duas versões do gcc há uma diferença sutil no funcionamento da função sscanf.
A solução da Nancy resolve o problema com a versão 4.3.3 do gcc no Linux. Acredito que essa solução funcione também com o gcc (ou com o Code::Blocks) no Windows, sem que seja preciso mudar mais nada (isto é, sem a mudança que você fez na comparação com '\0', André). Alguém pode confirmar isso?
Reverbel
A solução da Nancy resolve o problema com a versão 4.3.3 do gcc no Linux. Acredito que essa solução funcione também com o gcc (ou com o Code::Blocks) no Windows, sem que seja preciso mudar mais nada (isto é, sem a mudança que você fez na comparação com '\0', André). Alguém pode confirmar isso?
Reverbel
Tive o mesmo problema do André tanto no gcc 4.3 do linux quanto no Code::Blocks, mas bastou inicializar as strings como a Nancy fez que funcionou em ambos.
Tanto no gcc 4.3 e no Code:Blocks 8.02 (também usa gcc 4.3), ao que parece a função sscanf() não altera a string se o buffer estiver vazio. Tentei inicializar as strings com 's' na posição zero e imprimí-las depois das leituras, quando não digitava os nomes dos arquivos ambas as strings exibiam a primeira letra 's' e mais alugm lixo.
Tanto no gcc 4.3 e no Code:Blocks 8.02 (também usa gcc 4.3), ao que parece a função sscanf() não altera a string se o buffer estiver vazio. Tentei inicializar as strings com 's' na posição zero e imprimí-las depois das leituras, quando não digitava os nomes dos arquivos ambas as strings exibiam a primeira letra 's' e mais alugm lixo.
Alterei o fragmento de código do enunciado para que ele deixe de ter comportamento dependente da versão do compilador. O código modificado deve funcionar com qualquer versão do gcc. A nova versão do enunciado já está na página da disciplina.
As únicas modificações foram nas declarações dos vetores nome_arq_entrada e nome_arq_saida. Na nova versão do enunciado esses vetores são inicializados com a string vazia (""):
$ diff ep1-versao-anterior.html ep1.html
212,213c212,213
< char nome_arq_entrada[MAX_NOME_ARQ]; /* nome do arquivo de entrada */
< char nome_arq_saida[MAX_NOME_ARQ]; /* nome do arquivo de saida */
---
> char nome_arq_entrada[MAX_NOME_ARQ] = ""; /* nome do arquivo de entrada */
> char nome_arq_saida[MAX_NOME_ARQ]= ""; /* nome do arquivo de saida */
Essa correção é equivalente à da Nancy.
As únicas modificações foram nas declarações dos vetores nome_arq_entrada e nome_arq_saida. Na nova versão do enunciado esses vetores são inicializados com a string vazia (""):
$ diff ep1-versao-anterior.html ep1.html
212,213c212,213
< char nome_arq_entrada[MAX_NOME_ARQ]; /* nome do arquivo de entrada */
< char nome_arq_saida[MAX_NOME_ARQ]; /* nome do arquivo de saida */
---
> char nome_arq_entrada[MAX_NOME_ARQ] = ""; /* nome do arquivo de entrada */
> char nome_arq_saida[MAX_NOME_ARQ]= ""; /* nome do arquivo de saida */
Essa correção é equivalente à da Nancy.