2016-08-10 5 views
-4

텍스트 파일에서 읽는 것입니다. 텍스트 파일의C 프로그래밍 - 텍스트 파일에서 읽기

  1. 이름
  2. 지연 시간을 읽고 싶어 얼마나 많은 라인 (들)
  3. :

    나는 3 개 명령 줄 인수를 가지고있다.

텍스트 파일이 끝날 때까지 사용자가 지정한 줄 번호로 해당 텍스트 파일을 읽고 싶습니다.

예를 들어 처음으로 5 줄을 읽은 다음 프로그램에서 how many line(s) do you want to read?을 묻습니다. 나는 7이라고 입력하면 5에서 12 행까지 읽습니다.

이것은 파일의 끝까지 반복됩니다.

#include <stdlib.h> 
#include <stdio.h> 
#include<time.h> 
#include <string.h> 
void delay(unsigned int mseconds) 
{ 
clock_t goal = mseconds + clock(); 
while (goal > clock()); 
} 
int countlines(const char *filename) { 
FILE *fp = fopen(filename, "r"); 
int ch, last = '\n'; 
int lines = 0; 

if (fp != NULL) { 
    while ((ch = fgetc(fp)) != EOF) { 
     if (ch == '\n') 
      lines++; 
     last = ch; 
    } 
    fclose(fp); 
    if (last != '\n') 
     lines++; 
} 
return lines; 
} 
int main(int argc, char *arg[]) 
{ 
FILE *ptDosya; 
char ch; 
ch = arg[1][0]; 
int s2; 
int satir = 0; 
int spaceCounter=0; 
int lineCount, x = 0; 
lineCount = atoi(arg[3]); 
s2 = atoi(arg[2]); 
printf("dosya %d satir icerir.\n", countlines(arg[1])); 
ptDosya = fopen(arg[1], "r"); 
if (ptDosya != NULL) 
{ 
    while (ch != EOF&& x < lineCount) 
    { 
     ch = getc(ptDosya); 
     printf("%c", ch); 
     if (ch == '\n') 
     { 
      delay(s2); 
      x++; 
     } 
    } 
    while (x < countlines(arg[1])) 
    { 
     printf("satir sayisi giriniz:"); 
     scanf("%d", &lineCount); 
     // i don't know what should i do in this loop.. 
    x=x+lineCount; 
    } 
} 

else { 
    printf("dosya bulunamadi"); 
} 
printf("\n\nend of file!\n"); 
fclose(ptDosya); 
return 0; 
system("PAUSE"); 
} 
+2

이 코드의 문제점은 무엇입니까? (나는 하나를 본다 : 당신의 지연 루프는 CPU 집약적 인 루프이며, 그리 좋지 않다!) –

+1

그것은 약간의 추가가 필요하다. 이 코드는 텍스트가 끝날 때까지 묻지 않습니다. –

답변

1

delay 함수는 통화 중 루프를 사용합니다. 이것은 컴퓨팅 능력 측면에서 불필요하게 비쌉니다. 배터리로 작동하는 장치에서이를 수행하는 것은 매우 환영 할만한 일이 아닙니다. 또한 clock()은 반드시 밀리 초를 반환하지 않습니다. clock() 함수에서 사용하는 단위는 CLOCKS_PER_SEC 매크로를 사용하여 결정할 수 있습니다. 안타깝게도 지연을 밀리 초 단위로 지정할 수있는 이식성이 없으며 POSIX 표준 시스템은 usleep()nanosleep()입니다.

줄 계산 기능이 잘못되었습니다. 줄 바꿈없이 끝나지 않는 한 1 줄을 너무 많이 계산합니다.

  • 당신은 너무 충분한 인수가 명령 행에 전달을 확인하지 :

    int countlines(const char *filename) { 
        FILE *fp = fopen(filename, "r"); 
        int ch, last = '\n'; 
        int lines = 0; 
    
        if (fp != NULL) { 
         while ((ch = fgetc(fp)) != EOF) { 
          if (ch == '\n') 
           lines++; 
          last = ch; 
         } 
         fclose(fp); 
         if (last != '\n') 
          lines++; 
        } 
        return lines; 
    } 
    

    너무 main() 기능에 문제가 있습니다

    여기에 개선 된 버전입니다.

  • 주된 독서 루프에서 EOF을 확인하지 마십시오. ...
  • 당신은 파일의 끝 때까지 루프에서이 과정을 반복하지 않으며, 당신도 라인의 지정된 수를 읽은 후 질문 how many line(s) do you want to read?을 물어 않는
+0

감사하지만 내 주요 문제는 끝날 때까지 텍스트를 읽는 것입니다. –

+0

네가 맞다.하지만 나는 그 도서관을 잘 못한다.그리고 내가 어떻게하면 마지막으로 작성된 줄에 색인을 붙이고 거기에서 계속 진행할 수 있습니까? –

+0

@ f.koglu : 죄송합니다. 귀하의 의견을 이해할 수 없습니다. – chqrlie

0

첫째, 파일을 찾을 수없는 경우, countlines 메서드는 0을 반환합니다. 이 값을 사용하여 오류 메시지를 작성하고 나머지 코드는 건너 뜁니다.

둘째, 다음 루프에서, 당신은

if (ch != '\n') { 
     printf("%c", ch); 
    } else { 
     printf("\n"); 
     delay(s2); 
     x++; 
    } 

이유는 두 가지의 printf 문을 사용? 그들은 똑같은 것을 인쇄 할 것입니다. 아마도 다음과 같을 것입니다 :

ch = getc(ptDosya); 
/* exit the loop here if you hit EOF */ 

printf("%c", ch); /* Why not putc() or putchar() ? */ 
if (ch == '\n') { 
    x++; 
    if (x == lineCount) { 
     x = 0; 
     lineCount = requestNumberOfLinesToRead(); 
    } else { 
     sleep(s2); /* instead of delay(). Remember to #include unistd.h */ 
    } 
} 
+0

내 문제를 이해합니까? 내 코드의 누락 된 부분을 쓸 수 있습니까? –