display_text.c Das Programm verwendet keine Matrix von Zeichenfolgen als Puffer, sondern liest direkt die Zeichenfolgen aus dem Text. Der Text muss als Seiten mit jeweils 40 Zeilen angezeigt werden. Nach dem Drucken der ersten Seite zeigt das Programm eine Eingabeaufforderung >>
und wartet auf den Befehl des Benutzers.Lesen Sie Zeilen aus einer Textdatei, drucken Sie 40 davon und verwenden Sie den Systemaufruf lseek oder fseek, um den Offset zu ändern?
Befehle sind:
n: to show next page
p: to show previous page
q: to quit the program
Das Programm verwendet lseek(fd, offset, mode)
oder fseek()
den Systemaufruf. Achten Sie darauf, dass die Zeilen unterschiedlich lang sind!
//LIBRARIES
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//GLOBAL VARS
const char *filename = NULL; //file name
FILE *file; //file stream
int page_number=1; //number of current page
int line_count;
int page_total=0;
//PROTOTYPES METHODS
int prompt(void);
int print_page(int num_page_print);
int main(int argc, char *argv[]) {
int i; //loop counter
char name[50]; //name of file
//read the name of the file from command line
if(argc!=2) {
printf("Specify input on command line.\n");
scanf("%s", name);
filename = name;
}
else if(argv[1]!=NULL)
filename=argv[1];
else
return 1; //error
//try to open the file
file=fopen(filename, "rt");
if(file == NULL){
printf("Cannot open the file! %s \n",filename);
return 1; //error
}
prompt(); //call for prompt
fclose(file); //close file
return 0; //everything has gone as supposed :-)
}
int prompt(void) {
char *cmd=NULL; //cmd
cmd=malloc(2*sizeof(char*)); //allocate two bit for command
char line[100];
while(fgets(line, sizeof(line), file)!=NULL) //count file lines
line_count++;
rewind(file);
//number of total pages
if(line_count%40==0)
page_total=line_count/40;
else
page_total=line_count/40+1;
//printf("\nTotal pages are %d\n",page_total);
//while cmd!=q, continue to show prompt >>
while(1){
//VIEW ALL COMMANDS
printf("a: next page; i: previous page; q: quit\n");
printf(">> ");
scanf("%s", cmd);
//next page
if(page_number!=page_total && strcmp(cmd,"n")==0){
print_page(page_number+1); //print next page
page_number++; //update number of page
}
//prev page
if(page_number!=1 && strcmp(cmd,"p")==0){
print_page(page_number-1); //print prev page
page_number--; //update number of page
}
//exit
if(strcmp(cmd, "q")==0){
free(cmd); //free memory
return 0; //success, return zero
}
}
}
//My problems start here
int print_page(int num_page_print) {
char line[100];
int i;
if(num_page_print < page_number)
//fseek change offset to print prev page
else
//fseek change offset to print next page
for(i = 0; i < 40; i++) {
fread(line, sizeof(line),1, file);
//how do I print lines that have different lengths!
printf("[%d] %s\n",i+1, line);
}
}
//Any comments, reccomendations and critics are welcome :-)`
Ich möchte: erste 40 Zeilen eines file.txt
gegeben drucken, aber da ich direkt aus der Datei zu lesen, wird der Ausgang I erhalten, dass mehr als 40 Zeilen gedruckt werden, wahrscheinlich, weil die char line[100]
Zeichenfolge vorgegeben , wenn Sie mir vorschlagen könnten, wie man jene Linien druckt, die unterschiedliche Größe haben, die groß wären!
'scanf ("% s ", Name);' <- Pufferüberlauf. –
Haben Sie noch Fragen? Außerdem sollten Sie die Rückgabe von 'malloc' und Druck und Fehler überprüfen, zum Beispiel mit' perror', falls es fehlgeschlagen ist. – Badda
Ich habe Probleme, genau 40 Zeilen einer TXT-Datei zu drucken und mit fseek() die Druckmethode zu verwalten, der Rest funktioniert gut, da bereits in einem anderen Programm verwendet – Midnight