Ler o arquivo linha por linha usando fscanf em C
-
Use a função
fscanf
para ler o arquivo linha por linha em C -
Use a função
fscanf
para ler o arquivo palavra por palavra em C
Este artigo irá explicar vários métodos de como ler um arquivo linha por linha usando fscanf
em C.
Use a função fscanf
para ler o arquivo linha por linha em C
A função fscanf
faz parte dos utilitários de entrada formatados da biblioteca padrão C. Múltiplas funções são fornecidas para diferentes fontes de entrada como scanf
para ler de stdin
, sscanf
para ler a seqüência de caracteres e fscanf
para ler o fluxo de ponteiro FILE
. O último pode ser usado para ler o arquivo regular linha por linha e armazená-lo no buffer.
fscanf
tem especificação de formatação semelhante aos especificadores printf
, e todos eles estão listados em detalhes completos nesta [página]. No exemplo a seguir, abrimos o arquivo de entrada de amostra usando a chamada de função fopen
e alocamos memória do tamanho total do arquivo para armazenar o fluxo de leitura nele. "%[^\n] "
formato de string é especificado para ler o fluxo de arquivos até que o novo caractere de linha seja encontrado. fscanf
retorna EOF
quando o fim da entrada é alcançado; assim, iteramos com o loop while
e imprimimos cada linha uma por uma.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
struct stat sb;
stat(filename, &sb);
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Resultado:
> Temporary string to be written to file
Observe que, embora o código anterior provavelmente seja executado com êxito se o nome do arquivo de entrada existir no sistema de arquivos, várias chamadas de função podem falhar e encerrar o programa de forma anormal. O próximo exemplo de código é a versão modificada, onde as rotinas de verificação de erros são implementadas.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
if (!in_file) {
perror("fopen");
exit(EXIT_FAILURE);
}
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Resultado:
> Temporary string to be written to file
Use a função fscanf
para ler o arquivo palavra por palavra em C
Outro caso útil para utilizar a função fscanf
é percorrer o arquivo e analisar cada token separado por espaço. Observe que a única coisa a ser alterada do exemplo anterior é o especificador de formato para "%[^\n ] "
. A chamada de sistema stat
é para recuperar o tamanho do arquivo, e o valor é usado para passar como o argumento malloc
para alocar o buffer. Este método pode ser um desperdício para alguns cenários, mas garante que mesmo os maiores arquivos de uma única linha possam ser armazenados no buffer.
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
const char *filename = "input.txt";
int main(int argc, char *argv[]) {
FILE *in_file = fopen(filename, "r");
if (!in_file) {
perror("fopen");
exit(EXIT_FAILURE);
}
struct stat sb;
if (stat(filename, &sb) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
char *file_contents = malloc(sb.st_size);
while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
printf("> %s\n", file_contents);
}
fclose(in_file);
exit(EXIT_SUCCESS);
}
Resultado:
> Temporary
> string
> to
> be
> written
> to
> file
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook