Fiz algumas alterações pontuais no código. Minhas habilidades em C estão um pouco enferrujadas, faz algum tempo que não programo com frequência na linguagem, por isso limitei-me a reproduzir a forma com que trataste os erros. Não vi qualquer problema grave em seu código, recomendo a leitura de https://www.tutorialspoint.com/cprogramming/c_error_handling.htm .
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define HEADER_MSG "Tradutor: \nRevisor: \nEditor: \n\n\n\n"
#define ERROR_MSG(x) "Erro na Gravação do " x "\n"
#define THE_PAGE "* Página %d *\n\n\n\n"
#define THE_CHAPTER "* Capítulo %d *\n\n\n\n"
#define BUFFER_SIZE 128
void printing_pages_on(FILE *const file, int chapterNumber) {
static char buffer[BUFFER_SIZE] = "";
if(fprintf(file, THE_CHAPTER, chapterNumber) == EOF)
printf(ERROR_MSG("capítulo"));
printf("Número de páginas do capítulo %d: ", chapterNumber);
fgets(buffer, BUFFER_SIZE, stdin);
int numPaginas = atoi(buffer);
for (int x = 1; x <= numPaginas; x++)
if(fprintf(file, THE_PAGE, x) == EOF)
printf(ERROR_MSG("número da página"));
}
int main(int argc, char **argv) {
FILE *arq;
setlocale(LC_ALL,"");
printf("Gerador de páginas de capítulo v1.0\n\n");
if ((arq = fopen("capitulo.txt", "wt")) != NULL) {
if(fprintf(arq, HEADER_MSG) == EOF)
printf(ERROR_MSG("cabecalho"));
const int CHAPTERS_NUMBER = (argc > 1) ? atoi(argv[1]) : 1;
for (int i = 1; i <= CHAPTERS_NUMBER; i++)
printing_pages_on(arq, i);
printf("Prontinho! Obrigado por usar o programa!\n\n");
fclose(arq);
} else {
printf("Problemas na criação do arquivo\n");
}
return 0;
}
criei o script makefile abaixo, que funciona tanto no Linux quanto no Mac. Para Windows, você pode usar o WSL; ver https://docs.microsoft.com/pt-br/windows/wsl/install-win10:
CC=clang # poderia ser o gcc
CFLAGS=-Wall -O3 -std=c11 # habilita warnings,
# seta otimizações para o nível mais alto,
# estabelece o uso do padrão ISO C11
SRC=$(wildcard *.c)
OBJ=$(SRC:.c=.o)
EXE=prog
all: $(EXE)
$(EXE): $(OBJ)
$(CC) $^ -o $@ $(CFLAGS)
%.o: %.c
$(CC) -o $@ -c $< $(CFLAGS)
clean:
@rm *.o
remove: clean
@rm prog
para compilar o programa digitei make
no terminal. Ao executar a aplicação, com ./prog 5
, obtive algo como:
Gerador de páginas de capítulo v1.0
Número de páginas do capítulo 1: 10
Número de páginas do capítulo 2: 5
Número de páginas do capítulo 3: 25
Número de páginas do capítulo 4: 8
Número de páginas do capítulo 5: 20
Prontinho! Obrigado por usar o programa!
Mas ainda que seja interessante como exercício, este tipo de programa não é o mais indicado para ser feito em C, talvez uma linguagem de script, como Python ou mesmo Shell, seria mais indicada para esta tarefa. C é indicada para tarefas de alta performance, como motores gráficos, jogos, máquinas de busca, compiladores, sistemas operacionais, simuladores, etc. Em Python este mesmo programa ficaria assim:
def printing(chapters: int):
try:
with open("capitulo.txt", "w+") as file:
def title(name: str, number: int):
file.write("* %s %d *\n" % (name, number))
file.write("Tradutor: \nRevisor: \nEditor: \n")
for i in range(1, chapters + 1):
pages = int(input("Número de páginas do capítulo %d: " % i))
title("Capítulo", i)
for j in range(1, pages + 1):
title("Página", j)
print("Fim!")
except IOError:
print("Erro de operação em arquivo")
print("Gerador de páginas de capítulo v1.0");
printing(int(input("Quantos capítulos devo gerar? ")))