2016-08-10 7 views
-4

からの読み取りは、テキストファイルからの読み取りについてです。テキストファイルのCプログラミング - テキストファイル

  1. 遅延時間読みたいどのように多くの行(複数可)
  2. 私は3つのコマンドライン引数を持っています。

テキストファイルが終了するまで、ユーザーが指定した行番号でテキストファイルを読みたいと思っています。

たとえば、最初に5行を読み取った後、プログラムはhow many line(s) do you want to read?と尋ねます。私は7と入力します。

これはファイルの最後まで繰り返されます。

#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

このコードの問題点を教えてください。 (私は1つを見ます:あなたの遅延ループは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

ええ、あなたは正しいですが、私はcとそのライブラリにうまくいきません。そして、私は最後の筆記した行をどのように索引付けし、そこから続けるかを行うことはできません。 –

+0

@ f.koglu:申し訳ありませんが、私はあなたのコメントを理解していません。 – chqrlie

0

まず、ファイルが見つからない場合は、 countlinesメソッドはゼロを返します。その値を使用してエラーメッセージを書き、残りのコードをスキップする必要があります。

第二には、次のループでは、あなたは

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

なぜ2の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

あなたは私の問題を理解していますか?私のコードの欠けている部分を書くことができますか? –