2017-06-09 2 views
0

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!

+0

'scanf ("% s ", Name);' <- Pufferüberlauf. –

+3

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

+0

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

Antwort

0

Zwei Funktionen ermöglichen es, Zeile für Zeile leicht in der Datei zu lesen.

Die erste ist getline(), die ich Ihnen rate. Sie können darüber lesen here. Der Vorteil dieser Funktion ist, dass sie der Speichervariablen automatisch die richtige Größe zuweist, abhängig von der Länge der Zeile, die Sie lesen. Leider implementiert keine Version von C getline(). Es gehört nicht zum C-Standard, sondern zu POSIX.1-2008 und kann daher nur auf Systemen verwendet werden, die diesem Standard entsprechen.

Eine weitere Funktion, ein bisschen weniger freundlich zu bedienen ist fgets() welche Dokumentation ist here.

In beiden Fällen werden Sie nur eine Schleife machen müssen, die 40-mal iteriert, zum Beispiel:

char* storingVariable = NULL; 
size_t len = 0; 
for (int i = 0; i != 39; getline(&storingVariable, &len, inFile)) 
    printf("Line is : %s\n", storingVariable); 

Der üblicher Weg getline() zu verwenden ist folgendes:

int i = 0; 
char* storingVariable = NULL; 
size_t len = 0; 
while (getline(&storingVariable, &len, inFile) != -1) // This allows to read until the end of the file 
{ 
    printf("Line is : %s\n", storingVariable); 
    i++; 
    if (i == 39) 
     break; 
} 
// free the storing variable if you don't need it 

I fragte eine similar question vor kurzem, die Ihnen in einer viel detaillierteren Weise helfen könnte, als ich gerade tat.

+0

DANKE !!!!!!!!!!!!! – Midnight

+0

@ Midnight Kein Problem. Bitte akzeptieren Sie die Antwort, wenn es Ihr Problem gelöst hat und zögern Sie nicht, einige Fragen zu kommentieren, wenn Sie weitere Erklärungen/Details benötigen. – Badda

+1

Da "getline()" POSIX ist, kann ein Feature-Test-Makro erforderlich sein, um es auf einigen Systemen zu verwenden. Dieses Detail kann es wert sein, die Antwort hinzuzufügen. Zusätzlich gibt 'getline() '' '' zurück, wenn das Dateiende erreicht ist, so dass das zweite Beispiel nicht wie erwartet funktioniert. –

Verwandte Themen