こんにちは、ファイルからのスキャンについて少し助けが必要かもしれません。各行には 8 つの数字が含まれていますが、最後の 4 つだけをスキャンする必要があります。
私の考えは、数字全体をスキャンし、4 番目の位置から数字を新しい配列にコピーすることでした。もっと賢いアイデアはありますか?
こんにちは、ファイルからのスキャンについて少し助けが必要かもしれません。各行には 8 つの数字が含まれていますが、最後の 4 つだけをスキャンする必要があります。
私の考えは、数字全体をスキャンし、4 番目の位置から数字を新しい配列にコピーすることでした。もっと賢いアイデアはありますか?
これを行う簡単な方法は、ループ内で行を読み取り、fgets
次のように実行することです。
sscanf(buf, "%*4d%4d", &a);
これは最初の 4 桁を無視し、最後の 4 桁を integer にコピーしますa
。
そこには明らかにエラー チェックはありません (1 行あたり 8 桁の場合にのみ機能します) が、迅速かつ簡単です。の戻り値scanf
が 1 であることを確認できます。これは、4 桁の数値の読み取りが成功した場合です。
編集(@Grijesh Chauhanによる)
サンプルコード:
int main(){
FILE* fp = fopen("file","r");
char buf[128];
int a;
while(!feof(fp)){ // while end of file comes
fgets(buf, 127, fp); //read complete line in a buffer
sscanf(buf, "%*4d%4d", &a); //scanf from buffer, last 4 digits
printf("%d\n",a);
}
return EXIT_SUCCESS;
}
そして実行します:
$ gcc y.c -Wall -o y
$ ./y
5678
5432
8324
3223
ファイルの場合:
$ cat file
12345678
98765432
45678324
98653223
各行で、 で 4 文字を読み取り (そして破棄し) getc
、次に を使用fscanf
して 4 桁の数字を読み取ります。
sed
ただし、最初にファイルを渡すだけでした。
sed 's/^[0-9]{4}\([0-9]{4}\)$/\1/' <file | your_c_program.out
おまけとして、sed
このように使用すると、各行に実際に正確に 8 桁の数字があることが検証されます。
編集:fseek
代わりに使用することgetc
は、実際にはより良いアイデアです
これは興味深い質問です。私は C の専門家ではありません。私は自分の解決策を残します。
以下のコードでは「getline」関数を使用していますが、「sscanf」に投票します。しかし、「sscanf」は、文字列から特定の要素を取り出すためによく使用されます (スラッシュ、バックスラッシュ、またはドットで分割された数値など)。 @Toesmash の質問は、特定の位置から読み取ることであり、内容とは関係ありません。このような単純な作業に価値があるかどうかを検討する必要があります。
だから多分「getline」はシンプルで十分です。それが私の考えです。
int main()
{
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
if ((fp = fopen("sample.txt", "r")) == NULL )
{
/* do your error process */
}
while((read = getline(&line, &len, fp)) != -1)
{
/* you see here offset is 5, if you want the last 4 characters */
printf("%s", (line + (read - 5)));
}
return 0;
}
良いことは、必要なものすべて、頭へのポインター、長さなどを取得できることです。
悪い点は、行全体を読むことです。これはおそらく不要です:)
このプログラムは、各行の最後の 4 つの数字を読み取り (各行が 8 であると仮定)、それを変数 nr に入れます。
int main(void) {
char buff[8];
int nr;
FILE *theFile=fopen("/home/mppl/Desktop/file","r");
while(fscanf(theFile,"%s\n",buff)!=EOF){
nr= atoi(&buff[4]);
printf("nr=%d\n",nr);
}
}
これは、これを行うための最も安全な、または最も効率的な方法ではないかもしれませんが、実際には簡単です。