2016-04-18 30 views
0

Ich versuche zu finden, wie sich der Dateizeiger beim Durchlaufen der Datei bewegt. Zu diesem Zweck habe ich dieses Stück Code geschrieben -Datei Pointer Positionen in einer Textdatei in C

#include<stdio.h> 
#include<conio.h> 
void main() 
{ 
    FILE *fp; 
    fp=fopen("example.txt","w+"); 
    fputs("This is a test",fp); 
    printf("The initial text - \n"); 
    int x=0;              // For the purpose of debugging 
    rewind(fp); 
    while(!feof(fp)) 
    { 
     char ch=getc(fp); 
     printf("File pointer - %d and letter - ",ftell(fp)); 
     if(ch=='\t') 
      puts("tab"); 
     else 
     if(ch=='newline') 
      puts("\n"); 
     else 
      putchar(ch); 
     printf("\n"); 
    } 
    fputs("\nThis is the second line",fp); 
    printf("\n\nThe final text - \n"); 
    rewind(fp); 
    while(!feof(fp)) 
    { 
     char ch=getc(fp); 
     printf("File pointer - %d and letter - ",ftell(fp)); 
     if(ch=='\t') 
      puts("tab"); 
     else 
     if(ch=='\n') 
      puts("newline"); 
     else 
      putchar(ch); 
     printf("\n"); 
    } 
} 

Nun wird die O/P hierfür ist verständlich, mit Ausnahme von 3 Plätzen -

  1. Wenn die erste Zeile eingegeben wird, warum ist der Zeigerwert für die 14. Position zweimal vorhanden? Soll die Datei nicht beim ersten Auftreten des EOF - 14 enden?
    Warum passiert das?

  2. Nachdem die zweite Zeile eingegeben wurde, warum fehlt die 15. Position des Zeigers?

  3. Warum ist nach dem 16. Zeichen eine Zeile leer? Sollte nicht das 17. Zeichen in der nächsten Zeile ohne Leerzeile vorkommen?

+0

Ihr Compiler sollte Warnungen ausspucken, ignorieren Sie sie nicht. – Unimportant

+3

Möglicherweise verwandt: ['Warum ist "while (! Feof (Datei))" immer falsch?'] (Http: // stackoverflow.com/questions/5431941/why-is-while-feof-Datei-immer-falsch) – molbdnilo

+1

Nur als freundliche Erinnerung: 'int fgets (FILE * stream)' <= Es gibt einen Grund für die "Int", hier. – dhke

Antwort

0

Es gibt einige Sachen, die Sie wissen mussten, bevor Sie sie überhaupt benutzten.

#include <stdio.h> 
//#include <conio.h> 
void main() 
{ 
    FILE *fp; 
    fp=fopen("example.txt","w+"); 
    fputs("This is a test",fp); 
    printf("The initial text - \n"); 
    int x=0;              // For the purpose of debugging 
    rewind(fp); 
    while(!feof(fp)) 
    { 
     char ch=getc(fp); 
     if(ch==EOF){ 
      break; 
     } 
     printf("File pointer - %ld and letter - ",ftell(fp)); 
     if(ch==EOF){ 
      break;} 
     if(ch=='\t') 
      puts("tab"); 
     else 
     if(ch=='\n') 
      puts("newline"); 
     else 
      printf("%c",ch); 
     printf("\n"); 
    } 
    fputs("\nThis is the second line",fp); 
    printf("\n\nThe final text - \n"); 
    rewind(fp); 
    while(!feof(fp)) 
    { 
     int ch=getc(fp); 
     if(ch==EOF){ 
      break; 
     } 
     printf("File pointer - %ld and letter - ",ftell(fp)); 
     if(ch=='\t') 
      puts("tab"); 
     else 

     if(ch=='\n') 
      //printf("newline"); 
      //fputs(input, stdout); 
      fputs("newline",stdout); 
     else 
      putc(ch,stdout); 
     printf("\n"); 
    } 
} 
  1. Sie müssen prüfen, ob das Zeichen ist eigentlich ein EOF In einer Datei sogar EOF als ein Zeichen betrachtet wird, um das Ende zu vertreten. Die feof Funktion geht davon aus, dass es sich auch um ein Zeichen handelt und übergibt diese Schleife. Dort bekommst du einen Müll
  2. puts fügt tatsächlich einen Zeilenumbruch am Ende ein, wenn Sie es verwenden. Um es zu vermeiden, verwenden Sie stattdessen fputs
  3. Der erste Punkt sollte es erklären. Prost.
0

Sie wollen dies:

#include<stdio.h> 
#include<conio.h> 

void main() 
{ 
    FILE *fp; 
    fp=fopen("example.txt","w+"); 
    fputs("This is a test",fp); 
    int x=0;          // For the purpose of debugging 
    rewind(fp); 
    while(1)     // changement here 
    { 
     int ch=getc(fp);  // changement here 
     if (ch == EOF)  // changement here 
      break; 
     printf("File pointer - %d and letter - ",ftell(fp)); 
     if(ch=='\t') 
      puts("tab"); 
     else 
     if(ch=='\n') 
      puts("newline"); 
     else 
      putchar(ch); 
     printf("\n"); 
    } 
    fputs("\nThis is the second line",fp); 
    printf("\n\nThe final text - \n"); 
    rewind(fp); 
    while(1) 
    { 
     int ch=getc(fp); // changement here  
     if (ch == EOF)  // changement here 
      break; 

     printf("File pointer - %d and letter - ",ftell(fp)); 
     if(ch=='\t') 
      puts("tab"); 
     else 
     if(ch=='\n') 
      puts("newline"); 
     else 
      putchar(ch); 
     printf("\n"); 
    } 
} 

Jetzt sollte die Ausgabe, was Sie erwarten.

Ihr Problem war folgendes: Sie lesen eine Characterwr mit getc, aber Sie nicht testen, ob es ein EOF (Ende der Datei) ist. Die while (feof(...)) ist nutzlos, denn sobald Sie das letzte Zeichen der Datei gelesen haben, ist feof immer noch falsch, daher geben Sie die Schleife erneut ein, und dieses Mal gibt getcEOF zurück, die Sie ignorieren.

Siehe auch this question. BTW

  • Ich bin mir nicht sicher, was Ausgabe, die Sie eigentlich erwarten.
  • die zweite While-Schleife ist identisch mit der ersten, sollten Sie das in eine Funktion setzen.
+0

ftell gibt einen langen zurück% d könnte einen ungültigen Ausdruck ausgeben – Unimportant

+0

@ user1320881 true, aber höchstwahrscheinlich nicht relevant hier, da 'long' meistens die selbe ist wie' int'. –