Abertura de arquivos de entrada e saída

Abertura de arquivos de entrada e saída

by Andre Manoel -
Number of replies: 4
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é
In reply to Andre Manoel

Re: Abertura de arquivos de entrada e saída

by Nancy Falcao -
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);

In reply to Andre Manoel

Re: Abertura de arquivos de entrada e saída

by Francisco Reverbel -
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

In reply to Francisco Reverbel

Re: Abertura de arquivos de entrada e saída

by Kaonan Micadei -
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.
In reply to Andre Manoel

Re: Abertura de arquivos de entrada e saída

by Francisco Reverbel -
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.