arquivos.tex 14.6 KB
Newer Older
1 2
\documentclass[apostila.tex]{subfiles}

3 4
\usepackage{zref}
\zexternaldocument{alocacao_dinamica}
5 6

\begin{document}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
7 8
\chapter{Arquivos}

9
Como não podia deixar de ser, a linguagem C possui uma série de funções que permitem
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
10
que o programador possa manipular arquivos, seja para criá-los, ler ou escrever neles.
11

12
As funções descritas nesse capítulo utilizam ponteiros do tipo FILE* para manipular arquivos, seja
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
13
escrita ou leitura.
14 15 16

Declaração de uma variável ponteiro de arquivo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
17
\begin{lstlisting}
18
FILE *fp;
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
19 20 21 22 23
\end{lstlisting}


\section{Funções para manipulação de arquivos}

24 25 26 27
Veja a lista das funções mais comuns na tabela \ref{tab:mais_usada}. Todas as funções apresentadas estão na biblioteca
stdio.h.

\begin{table}[htb]
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
	\centering
	\begin{tabular}{|l|l|}
		\hline Função & Operação \\
		\hline fopen() & Abre um arquivo \\
		\hline fclose() & Fecha um arquivo \\
		\hline fputc() & Escreve um caractere em um arquivo \\
		\hline fgetc() & Lê um caractere de um arquivo \\
		\hline fseek() & Procura por uma posição do arquivo \\
		\hline fprintf() & Grava uma string num arquivo, com formatação (saída formatada) \\
		\hline fscanf() & Lê um string do arquivo, com formatação (entrada formatada) \\
		\hline feof() & Retorna verdadeiro se o fim do arquivo é encontrado \\
		\hline ferror() & Retorna verdadeiro se ocorreu um erro \\
		\hline fread() & Lê um bloco de dados de um arquivo \\
		\hline fwrite() & Escreve um bloco de dados em um arquivo \\
		\hline rewind() & Reposiciona o ponteiro de arquivo no começo do arquivo \\
		\hline remove() & Apaga o arquivo \\
44
		\hline
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
45
	\end{tabular}
46
	\caption{Funções mais usadas}\label{tab:mais_usada}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
47 48
\end{table}

49
\vspace{5cm}
50

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
51
\section{EOF}
52

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
53 54 55
EOF é uma constante definida na biblioteca stdio.h que é utilizada para indicar o fim de um arquivo.
No geral, qualquer função que realiza leitura sobre um arquivo retorna EOF se não houver mais nenhum
caracter a ser lido, ou seja, caso tenha sido atingido o final do arquivo.
56

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
57
\section{Função fopen()}
58

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
59
Protótipo:
60

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
61 62 63
\begin{lstlisting}
FILE * fopen(char *nome_do_arquivo, char *modo);
\end{lstlisting}
64

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
65
Esta função abre um arquivo e retorna um ponteiro de arquivo. O primeiro argumento é o nome do
66
arquivo. O segundo é uma string de formatos, listados na tabela \ref{tab:modo_acesso}.
67

68
\begin{table}[htb]
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
	\centering
	\begin{tabular}{|l|l|}
		\hline Modo & Significado \\
		\hline "r" & Abre um arquivo para leitura \\
		\hline "w" & Cria um arquivo para escrita \\
		\hline "a" & Acrescenta dados para um arquivo existente \\
		\hline "rb" & Abre um arquivo binário para leitura \\
		\hline "wb" & Cria um arquivo binário para escrita \\
		\hline "ab" & Acrescenta dados a um arquivo binário já existente \\
		\hline "r+" & Abre um arquivo para leitura/escrita \\
		\hline "w+" & Cria um arquivo para leitura/escrita \\
		\hline "a+" & Acrescenta dados ou cria um arquivo para leitura/escrita \\
		\hline "r+b" & Abre um arquivo binário para leitura/escrita \\
		\hline "w+b" & Cria um arquivo binário para leitura/escrita \\
		\hline "a+b" & Acrescenta ou cria um arquivo binário para leitura/escrita \\
		\hline "rt" & Abre um arquivo texto para leitura \\
		\hline "wt" & Cria um arquivo texto para leitura \\
		\hline "at" & Acrescenta dados a um arquivo texto \\
		\hline "r+t" & Abre um arquivo texto para leitura/escrita \\
		\hline "w+t" & Cria um arquivo texto para leitura/escrita \\
		\hline "a+t" & Acrescenta dados ou cria um arquivo texto para leitura/escrita \\
90
		\hline
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
91
	\end{tabular}
92
	\caption{Modos de acesso a arquivo}\label{tab:modo_acesso}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
93 94
\end{table}

95
\vspace{4.5cm}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
96 97 98
Exemplo:

\begin{lstlisting}
99 100
FILE *fp; // fp e um ponteiro para arquivo

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
101
if ((fp=fopen("teste.txt", "w")) == NULL) {
102
	// se não conseguiu criar arquivo ...
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
103 104 105 106 107
	puts ("Nao posso criar o arquivo!"n");
	exit(1);
}
\end{lstlisting}

108

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
109 110
Observação: Ao tentar abrir um arquivo já existente com a opção "w", será criado um novo arquivo
em disco, apagando o antigo.
111

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
112
\section{Função fclose()}
113 114 115 116 117 118

A função fclose é usada para fechar um arquivo que foi aberto por fopen. Ela escreve quaisquer dados
restantes do buffer para o disco e faz um fechamento formal em nível de sistema operacional.

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
119
\begin{lstlisting}
120
int fclose (FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
121 122 123
\end{lstlisting}


124 125 126 127
Onde fp é um ponteiro para um arquivo . Um valor de retorno igual a zero significa que a operação
foi realizada com sucesso, qualquer outro valor significa erro. Geralmente o único momento em que a
função fclose falhará é quando um disquete tiver sido removido do drive.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
128
\section{Função fputc()}
129 130 131 132
A função fputc é usada para escrever caracteres em um arquivo aberto para escrita.

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
133
\begin{lstlisting}
134
int fputc(int ch, FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
135
\end{lstlisting}
136

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
137 138
Onde ch é o caractere a ser escrito e fp é um ponteiro para um arquivo. Se não houver erro a função
retornará o caractere escrito. Em caso de falha, um EOF é retornado.
139 140


Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
141 142
\section{Função fgetc()}

143 144 145 146
A função fgetc() é usada para ler caracteres de um arquivo.

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
147
\begin{lstlisting}
148
int getc(FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
149
\end{lstlisting}
150

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
151 152
Onde fp é um ponteiro para um arquivo. A função retorna o caracter lido.
Exemplo:
153

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
154
\lstinputlisting{exemplos/arquivo.c}
155

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
156
\subsection{Exercícios}
157

158 159
\label{page_exer1}
\label{subsec:exer1}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
160 161
1) Escreva um programa que leia palavras digitadas pelo usuário enquanto ele não digitar ``fim'' e que
escreva estas strings em um arquivo chamado strings.dat.
162

163
O programa deverá gravar o final de cada string, ou seja, o caracter `\textbackslash 0'.
164 165 166 167 168

2) Escreva um programa que abra o arquivo strings.dat criado pelo programa do exercício anterior e
imprima as strings armazenadas na tela.

A cada vez que for encontrado um final de string, o programa deverá quebrar a linha (imprimir o
169
caracter `\textbackslash n').
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
170

171

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
172 173 174
\section{Função feof()}

Quando um arquivo é aberto para entrada binária, é possível encontrar um valor inteiro igual à marca
175 176 177 178 179 180 181 182
de EOF. Isso pode fazer com que seja indicada uma condição de fim de arquivo, sem que o mesmo tenha
sido realmente encontrado.

Para resolver este problema, incluiu-se a função feof(), que é usada para determinar o final de um
arquivo quando da leitura de dados binários.

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
183
\begin{lstlisting}
184
int feof(FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
185
\end{lstlisting}
186

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
187 188
Onde fp é um ponteiro de um arquivo usado por fopen(). O valor de retorno é verdadeiro (1) se o fim
do arquivo foi encontrado.
189

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
190
Exemplo:
191

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
192
\begin{lstlisting}
193
while (!feof(fp)) ch=getc(fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
194 195
\end{lstlisting}

196 197
Naturalmente, o mesmo método pode ser aplicado tanto a arquivos textos como a arquivos binários.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
198 199 200
\section{Função ferror()}

A função ferror é usada para determinar se uma operação em um arquivo produziu erro.
201 202 203

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
204
\begin{lstlisting}
205
int ferror(FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
206 207
\end{lstlisting}

208 209 210
Onde fp é um ponteiro para um arquivo. A função ferror retorna verdadeiro (1) se um erro ocorreu
durante a última operação com o arquivo e falso (0), caso contrário.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
211
Uma vez que cada operação em arquivo determina uma condição de erro, a função ferror deve ser
212 213
chamada imediatamente após cada operação com o arquivo, caso contrário, um erro pode ser perdido.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
214 215 216
\section{Função rewind()}

A função rewind reinicia o ponteiro do arquivo para o começo do mesmo.
217 218 219

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
220
\begin{lstlisting}
221
void rewind(FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
222 223
\end{lstlisting}

224 225
Onde fp é um ponteiro de arquivo.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
226 227
\section{Função remove()}

228 229 230 231
A função remove() apaga o arquivo especificado.

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
232
\begin{lstlisting}
233
int remove(char *nome do arquivo);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
234 235 236
\end{lstlisting}

Onde nome do arquivo é uma string contendo o nome do arquivo e o valor de retorno é 0 em caso de
237 238
sucesso e diferente de zero se ocorrer um erro.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
239 240 241
\section{Funções fgets() e fputs()}

Essas duas funções podem ler e escrever strings para fluxos.
242 243 244

Protótipos:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
245
\begin{lstlisting}
246 247
char *fputs(char *str, FILE *fp);
char *fgets(char *str, int tamanho, FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
248 249
\end{lstlisting}

250
A função fputs escreve a string em um arquivo fp especificado.
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
251
A função fgets lê uma string do arquivo fp especificado. A função fgets lê uma string até que um
252 253 254
caractere de nova linha seja lido ou tamanho-1 caracteres sejam lidos. Se uma nova linha é lida, o caracter
nova linha será adicionado ao final da string str.

255
Toda string lida por fgets é terminada pelo caracter nulo `\textbackslash 0'.
256

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
257 258
\subsection{Exercícios}

259
Resolva os dois exercícios da seção \ref{subsec:exer1}, na página \ref{page_exer1}, mas agora utilizando as funções fgets e fputs ao
260 261 262 263
invés de getc e putc.

Nesse caso, não se preocupe em gravar o caracter nulo.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
264
\section{Funções fread() e fwrite()}
265

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
266 267
As funções fread e fwrite permitem leitura ou escrita de um ou mais blocos de dados ao mesmo tempo.
estas funções são muito úteis para gravar diversos tipos de dados mais complexos, como vetores e estruturas.
268

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
269
Protótipos:
270

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
271
\begin{lstlisting}
272 273
unsigned fread(void *buf, int num bytes, int count, FILE *fp);
unsigned fwrite(void *buf, int num bytes, int count, FILE *fp);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
274 275 276 277
\end{lstlisting}


Na função fread(), buf é um ponteiro ou uma referência para uma região de memória que receberá os
278 279
dados lidos do arquivo.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
280 281
Observe que para obter uma referência para uma determinada operação, pode ser utilizado o operador
\& precedendo variável (ver seção ??, p.??). buf pode ser referência para qualquer tipo de dado.
282

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
283
O parâmetro num bytes é o tamanho, em bytes, do dado passado como parâmetro para leitura em
284 285
buf.

286
Como já foi visto na seção \ref{sec:sizeof}, o operador sizeof é ideal para obtenção do tamanho de um dado.
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
287
O parâmetro count indica quantos dados do tamanho num bytes deverão ser lidos para a memória,
288 289
ou seja, count é ideal para a leitura de vetores a partir de uma arquivo.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
290 291
Por final, o parâmetro fp é um ponteiro para um arquivo a partir do qual os dados serão lidos.
Exemplo:
292

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
293
\lstinputlisting{exemplos/fread.c}
294 295 296


Note, no exemplo anterior, que para realizar uma leitura sobre o vetor mat não foi necessário preceder
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
297 298
o nome da variável com o operador \&. Isso é possível porque toda matriz em C é considerada como se
fosse um ponteiro (uma referência para o início da matriz), como já foi visto na seção ??, p.??.
299

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
300 301
Para a função fwrite, os parâmetros têm significado semelhante aos já descritos.
buf é um ponteiro(referência) para um dado que deseja-se escrever.
302 303 304
num bytes é o tamanho do tipo de dado.
count é a quantidade de dados de tamanho num bytes que deve ser escrito.
fp é um ponteiro para o arquivo em que deverá ser realizada a escrita.
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
305
Exemplo
306

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
307
\lstinputlisting{exemplos/le_matriz.c}
308 309


Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
310
\subsection{Exercícios}
311 312

1) Escreva um programa que armazena dados digitados pelo usuário em uma estrutura cliente e grava
313
esta estrutura em um arquivo enquanto o campo código não for 0.
314

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
315 316 317 318 319 320
\begin{lstlisting}
struct cliente {
	int codigo;
	char nome[20];
};
\end{lstlisting}
321 322 323


Os primeiros bytes desse arquivo deverão ser reservados para gravar o número de registro gravados.
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
324
A variável de contagem deverá ser do tipo long int.
325

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
326 327
2) Escreva uma programa que abre o arquivo gerado pelo programa do exercício anterior, lê os primeiros
bytes para uma variável e finalmente lê todos os dados do arquivo de uma vez para um vetor clientes.
328

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
329
Note que o tamanho do vetor clientes deverá ser determinado dinamicamente, a partir da variável
330 331
que diz quantos clientes foram previamente gravados.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
332 333 334
\section{Funções fprintf() e fscanf()}

As funções fprintf e fscanf funcionam exatamente como as funções printf e scanf, mas ao invés de
335 336 337 338
operarem sobre a entrada e saída padrão, operam sobre um arquivo qualquer.

Protótipos:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
339
\begin{lstlisting}
340 341
int fprintf(FILE *fp, char *string de controle,....);
int fscanf(FILE *fp, char *string de controle,....);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
342
\end{lstlisting}
343

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
344
Onde fp é um ponteiro para um arquivo no qual deseja-se ler ou escrever.
345

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
346
\subsection{Exercício}
347

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
348 349
Apresente um código utilizando fprintf e fscanf ao invés de fwrite e fread que seja equivalente ao código
abaixo:
350
\vspace{50 mm}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
351
\lstinputlisting{exemplos/arquivos_exercicio1.c}
352

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
353
\section{Função fseek()}
354

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
355
Através da função fseek é possível posicionar o ponteiro de leitura/escrita de um arquivo para qualquer
356 357 358 359
posição dentro do arquivo.

Protótipo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
360
\begin{lstlisting}
361
int fseek (FILE *fp, long numbytes, int origem);
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
362 363 364
\end{lstlisting}

Onde fp é um ponteiro para um arquivo, numbytes, é o número de bytes, a partir da origem, necessários
365
para se conseguir a posição corrente e origem é uma das constantes definidas em stdio.h listadas na tabela
366
\ref{tab:const_posi}.
367

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
368
Observe que, através da função fseek, é possível posicionar a leitura/escrita para o início do arquivo
369
(fseek(fp, 0, SEEK\_SET)), tornando-a equivalente à função rewind.
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
370

371
\begin{table}[htb]
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
372 373 374 375 376 377
	\centering
	\begin{tabular}{|l|l|l|}
		\hline Origem & Nome da Constante & Valor \\
		\hline Começo do arquivo & SEEK\_SET & 0 \\
		\hline Posição corrente & SEEK\_CUR & 1 \\
		\hline Fim do arquivo & SEEK\_END & 2 \\
378
		\hline
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
379
	\end{tabular}
380
	\caption{Constantes de posição}\label{tab:const_posi}
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
381 382 383
\end{table}

Se a função fseek retornar zero, indica que houve sucesso na chamada à função fseek. Um valor
384 385
diferente de zero indica uma falha.

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
386
\begin{lstlisting}
387
// ...
388 389 390
FILE *fp;
char ch;

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
391
if ((fp=fopen("teste", "rb")) == NULL){
392
	printf ("o arquivo não pode ser aberto\n");
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
393 394
	exit (1);
}
395

396
fseek(fp, 234, SEEK_SET); // pode-se trocar o SEEK SET por 0
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
397
ch = getc(fp); // lê o 235o caracter
398

399
// ...
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
400 401
\end{lstlisting}

402

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
403
\section{Exercícios}
404 405 406 407 408

1. Escreva um programa que receba dados informados pelo usuário em uma estrutura questao, definida

abaixo:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
409 410 411 412 413 414 415
\begin{lstlisting}
struct questao{
	char enunciado[255];
	int n_opcoes, soma_correta;
	char** texto_opcao;
}
\end{lstlisting}
416 417 418 419


O funcionamento do programa deverá ser o seguinte:

Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
420 421 422 423 424 425 426
\begin{itemize}
	\item recebe-se o enunciado da questão;
	\item recebe-se o número de opções desta questão;
	\item recebe-se o texto referente a cada opção, o qual é armazenado na matriz texto opcao;
	\item a cada vez que o programa requisita que o usuário digite o texto, deverá ser apresentado o
número de soma da questão (que deverá ser sempre uma potência de 2).
\end{itemize}
427

428
A matriz texto\_opcao é uma matriz bidimensional, que será indexada por 0..n para determinar o
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
429
número da opção, e para cada opção deverão ser alocados 128 bytes para entrar com a string.
430

431
Por final, o programa deve requisitar que seja digitado o valor da soma\_correta.
432
Depois de terminada a entrada de dados, o programa deverá armazenar a estrutura em um arquivo
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
433
chamado ``questoes.dat'' e perguntará ao usuário se deseja gravar mais questões.
434

435
2. Escreva um programa que vai ler o arquivo ``questoes.dat'' criado pelo programa do exercício anterior,
Jomaro Rodrigues's avatar
Jomaro Rodrigues committed
436 437
e simplesmente irá imprimir o enunciado da questão, o texto das opções com seus respectivos
números e o valor da resposta.
438 439

\end{document}