ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

C言語の<ctype.h>のisspace()について教えてください。

まだ初心者なので、変な質問でしたらすみません。
ライブラリで用意されているisspace()関数があります。
空白類の文字判定を行えるとあり、引数はint型で指定することになっています。

そこで疑問なのですが文字列をgetcで取ってきた時にcはEOFの時にマイナスを取るわけですが、問題ないのでしょうか?

例えば
int c;
while( !isspace( c = getc( fp )) && c != EOF ){・・・

getcを(unsigned char)ででもキャストすると解消するとは思いますが、問題ないのならば加えたくありません・・。以上ですが、分かりにくい説明でご迷惑おかけします。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> そこで疑問なのですが文字列をgetcで取ってきた時にcはEOFの時にマイナスを取るわけですが、


> 問題ないのでしょうか?

K&R 2 によると,
「各関数に対し,引数は int で与える。
 その値は EOF か,あるいは unsigned char として表現できるものでなければならず,
 戻り値は int となる。」
とありますから問題ないでしょう。(「各関数」というのは ctype.h で宣言された各関数のことです。)

心配なら先に EOF でないことをチェックしておけばいいです。
    • good
    • 0
この回答へのお礼

早急なご回答どうもありがとうございます。
すみません、yoppiiさんに言われた後調べたら載っていました。納得です!!

お礼日時:2003/09/26 18:44

こんにちは。

どこがわかりませんか?getc のプロトタイプ宣言は
int getc(FILE *stream)
ですから、ファイルストリームから読み込んだ
文字コードの値を int にキャストして戻してくれるわけです。
ですからキャストの必要はありません、というか EOF との比較ができなくなりますので
してはいけません。

また int は符号付き(signed)ですから、EOF(普通は -1)も楽に格納できます。
    • good
    • 0
この回答へのお礼

早急なご回答どうもありがとうございます。
すみません、主旨がわかりにくい質問ですよね・・。
isspace()の引数に-1を入れてもいいのかどうかが疑問でした。。。失礼しました^^;

お礼日時:2003/09/26 18:42

isspace()の引数が対象外の値の場合は0を返すことになっているようですので、問題は無いとは思いますが。



心配でしたら、以下のように書いてみてはどうでしょうか

int c;
while( (c=getc(fp)) != EOF && !isspace(c) )
{
.......

この場合、先に (c=getc(fp)) != EOF がFALSEになった段階で、次の !isspace(c) は評価されなくなります。
    • good
    • 0
この回答へのお礼

どうもありがとう御座います。
早急なお答え感謝です。

お礼日時:2003/09/26 18:33

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qscanf("%s", buf);でスペースを含んだ文字

コンソールプログラムで
scanf("%s", buf);
を使用してユーザに入力された文字によって処理を行いたいのですが、このままではスペースを含む文字列がスペースの手前で切られてしまいます。
C:\Program Filesなどを入力可能にさせたい場合にはどのようにするのがベターですか?

Aベストアンサー

お任せください!
そもそもscanfを使うというのはお勧めでは
ありません。scanfは文字+改行文字が入力
されないと完了しないためです。
が、それは良しとしましょう。
scanfの書式ですが、

int n = scanf("%[^\r\n]",buf);

という便利な書式があります。
perlでもおなじみの書式ですね。
上記の山文字"^"より前が読み込ませたい文字の集まりで、ハイフン指定が出来ます。
"^"より後ろが読込みを停止させたい文字の集まりです。上記の指定は復帰改行以外の文字が現れるまで読み込みます、という書式です。
下記のような指定も出来ます。

int n = scanf("%[a-zA-Z0-9\\: \t^\r\n]",buf);

なお、戻り値は読み込んだ項目数ですので、
if(n >= 1)
{
}
で判断できますね。

QC言語 exitの使い方

exit(0)とexit(1)の使い分けが理解できなくて困っています。
1と0では真・偽正反対の意味だと思ってしまいます。
return 0 は正常終了。return -1は異常終了と覚えているのですが、exitの場合はどう使い分けているのでしょうか?なにか決まりがあるのでしょうか?
すみませんが、教えて下さい。よろしくお願いします。

Aベストアンサー

慣用的に、
正常終了ならexit(0);
異常終了ならexit(1);
としています。

exit(x);とreturn x;
は、同じ意味となります。
(C言語の規格で、main()からreturnする終了は、
exitの終了と同等となっている)

正常終了ならexit(0);もしくはreturn 0;は意見が分かれないと思います。
問題は、異常終了の時1とするか-1とするかですが、
これはどっちでもいいです。
気になるなら、stdlib.hで定義されているEXIT_FAILUREマクロを使って、
exit(EXIT_FAILURE);
とすればいいでしょう。
エラーの種類によって値を変えてもいいし。

ところで、exit(0);とexit(1);の違いですが、
Windowsの場合、実はあまり意味がありません。
この値は、バッチファイルの中でエラーレベルとして
取得されます(詳細は略)。
昔のプログラムの中には、
エラーレベルの値によってバッチファイルに情報を伝えるというものがありました。
しかし現在はバッチファイルの使用は少なくなってきており、
終了時に0を指定使用が1を指定しようが、
その値を利用されることがほとんどありません。
ただ、なんとなく、正常終了ならエラーレベル0、以上ならそれ以外、としています。

UNIXやLinuxで、コンソールで動くツールならば、
利用される場面はあります。
(「終了ステータス」として、シェル(.shや.csh)の中で使えます)

慣用的に、
正常終了ならexit(0);
異常終了ならexit(1);
としています。

exit(x);とreturn x;
は、同じ意味となります。
(C言語の規格で、main()からreturnする終了は、
exitの終了と同等となっている)

正常終了ならexit(0);もしくはreturn 0;は意見が分かれないと思います。
問題は、異常終了の時1とするか-1とするかですが、
これはどっちでもいいです。
気になるなら、stdlib.hで定義されているEXIT_FAILUREマクロを使って、
exit(EXIT_FAILURE);
とすればいいでしょう。
エラーの種類によっ...続きを読む

Q変数が""(空文字)かどうか判別する方法

度々お世話になります。

C++で""(空文字)かどうかを判別する方法はありますか?
私は単純にstrcmpで文字列比較をすればいいと思っていたのですが、
TLSを使用しているためか、なぜかうまくいきません。

// 変数宣言&取得(Setは省略)
__declspec( thread ) char tls_Name [12] = "";

const char * TlsGetName( void )
{
return tls_Name;
}

// 取得&判別(スレッド内処理)
if (strcmp(TlsGetName(),"") == 0)
処理A
else
処理B

このとき、初回実行時は処理Aに行ってくれるのですが
2回目の実行以降はtls_Nameが""であるにもかかわらず
処理Bに行ってしまいます。

どこかおかしな所やもっといい方法がありましたら教えてください。

Aベストアンサー

strlen()で長さが0であれば、空の文字列
もしくは
if( tls_Name[0]=='\0' ) {
文字列が空の時の処理
}

Q入力エラーの処理について。

Cプログラム初心者です。
例えば、floatの名前をlengthとして、scanfでユーザーに入力させるとします。その時ユーザが間違えて数字ではなく文字を入力した場合、その後のprintfの内容がループしてしまいます。どうしたら、ユーザーが間違えて入力したときに、入力ミスを伝え、もう一回入力をしてもらうことができるプログラムが作れるでしょうか。
以下がエラー処理をする前のプログラムの一部なのですが、、、。

float length;

printf("Enter length of the room in metre and press enter.\n");
scanf("%f", &length);
while (length>300)
{

printf("This programme only caluculate length under 300m.\n");
printf("Please re-enter the length in metre and press enter.\n");
scanf("%f", &length);

}/*End of while (length)*/

Cプログラム初心者です。
例えば、floatの名前をlengthとして、scanfでユーザーに入力させるとします。その時ユーザが間違えて数字ではなく文字を入力した場合、その後のprintfの内容がループしてしまいます。どうしたら、ユーザーが間違えて入力したときに、入力ミスを伝え、もう一回入力をしてもらうことができるプログラムが作れるでしょうか。
以下がエラー処理をする前のプログラムの一部なのですが、、、。

float length;

printf("Enter length of the room in metre and press enter.\n");
scanf...続きを読む

Aベストアンサー

どのレベルまでのエラーチェックが必要かが不明ですが…
私ならfgets()->strtod()という手順を踏みます。

・scanf()は入力を消費しない
scanf()はエラーを返したときに入力内容を消去しません。
結果、いとも簡単に無限ループに陥ります。
エラー派生時には入力バッファのフラッシュをする必要があります。
・gets()は入力文字数を制限できない
gets()は文字列入力関数ですが、入力文字数を制限する機能がありません。
結果、想定しない文字数を入力される可能性があります。
これは、scanf()で%sを使ったときも同じです。
(sanf()の場合は回避法アリ)
・atof()は変換不能文字を報告しない
atof()はエラーを報告する手段をもちません。
入力 出力
0.0  0.0
abc  0,0
1.0  1.0
1.b  1.0
abcや1.bという数値はありません。これらはエラーのはずですが、atof()にエラー報告の機能が無いために「変換可能だった文字だけを変換した結果(1.b→1.0)または、0.0(abc→0.0)」が返されます。

char *fgets()は入力文字の最大数を制限できます。
fgets(char *入力文字列用の配列,int 入力可能文字数+1,stdin);
入力可能文字数+1なので単純に配列のよう素数を指定すればオッケーです。
(入力文字の最後に'\0'が付加されるため「入力可能文字数+1」を指定します)
キーボード入力を受け取る場合最後の引数をstdinとします。

strtod()は変換不能文字を発見したときに、その文字のアドレスを報告します。
結果、1.bやabcなどという「数字として認識不能な並び」を発見できます。
double strtod(char *変換する文字列,char **変換不能文字のアドレス);

キーボード入力の場合の例)
double len ;
char str[10], *trm ;

if (fgets(str, sizeof(str), stdin) == NULL){
/* 9文字以内の文字列をキーボードから入力 */
/* fgets()がNULLを返したときは"入力無し”かエラー */
エラー処理
}

len = strtod(str, &trm) ; /* 文字列→浮動小数点変換 */
if (trm != NULL && (*trm != '\0' || *trm != '\n')) {
/* 変換不能文字が'\0'か改行なら入力は数値、それ以外なら数値以外の入力 */
printf("数値以外が入力された:%s", str) ;
エラー処理
}
/* lenに入力を浮動小数点変換したものが設定されている */

どのレベルまでのエラーチェックが必要かが不明ですが…
私ならfgets()->strtod()という手順を踏みます。

・scanf()は入力を消費しない
scanf()はエラーを返したときに入力内容を消去しません。
結果、いとも簡単に無限ループに陥ります。
エラー派生時には入力バッファのフラッシュをする必要があります。
・gets()は入力文字数を制限できない
gets()は文字列入力関数ですが、入力文字数を制限する機能がありません。
結果、想定しない文字数を入力される可能性があります。
これは、scanf()で%sを使っ...続きを読む

Q文字列がNULLか空文字列かの判定

Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0)
文字列の扱いについて、質問します。

関数 int func(char *str) があると仮定します。
パラメータとして、strは以下のような状態あるとします。
(strは関数が呼ばれる前にcalloc()で領域確保済み)
 シンボル名 値
 str      0x00000001 ""
上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。
どうしたらよいのでしょうか。アドバイスをお願いします。

Aベストアンサー

No1の方の回答にあるように、calloc()で取れた領域のアドレスを正しく渡せてないように思えますが...

#defineERROR(-1)

int func(char *str)
{
  if( (!str) || (!strlen(str)) ) return ERROR;
  return strlen(str);
}

void main()
{
  char *p=(char*)calloc(10,10);
  printf("%d\n",func(p));
}

Qコンパイルエラー invalid operands to binary

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst         uvwxyz0123456789+/=";
unsigned char *p;
unsigned char *q;
unsigned char a[4];
char *RtnBuf;
int j=0;
int cnt;

RtnBuf = (char *)malloc(length+1);
memset(RtnBuf, 0, length+1);

p = (unsigned char*)buf;
q = (unsigned char*)RtnBuf;
cnt = 0;
while(*p != 0) {
a[0] = a[1] = a[2] = a[3] = 0;
a[0] = strchr(b64, p[0]) - b64;
a[1] = strchr(b64, p[1]) - b64;
a[2] = strchr(b64, p[2]) - b64;
a[3] = strchr(b64, p[3]) - b64;

q[0] = ((a[0] << 2) | (a[1] >> 4)) & 0xff;
cnt++;

if (p[2] != '=') {
q[1] = ((a[1] << 4) | (a[2] >> 2)) &0xff;
cnt++;
}
if (p[3] != '=') {
q[2] = ((a[2] << 6) | a[3]) & 0xff;
cnt++;
}
p += 4;
q += 3;
}
*outlen = cnt;
return(RtnBuf);
}

コンパイルはRed Hatでgccを使ってコンパイルしています。
引数は第1引数がデコード対象の文字列、第2引数がデコード対象文字列長、第3引数がデコード後の文字列長で、戻り値がデコード後の文字列です。

自己啓発で入力文字列をBASE64デコードする関数を作っているのですが、L20~L23(a[0] = strchr(b64, p[0]) - b64;)でコンパイルエラーinvalid operands to binaryが発生して色々試行錯誤しているのですが、どうしてもエラーがとれません。
ソースをここに書くのは大変恐縮なのですが、原因がわかる方がいらっしゃいましたら、教えていただけないでしょうか?

char *Base64n(unsigned char *buf, size_t length, size_t *outlen)
{
const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst ...続きを読む

Aベストアンサー

手元にgccが無いので、Windowsのbcc32でコンパイルしてみたところ、
エラーが出ずに通ってしまいました。
だから自信がないのですが…。

a[0] = strchr(b64, p[0]) - b64;



a[0] = strchr(b64, p[0]) - b64[0];

に変えてみたらどうでしょう。
"invalid operands to binary"
は、たぶん、マイナスの両側で型が違っていることを
表しているのではないでしょうか。(←これも自信なし)
strchr()が返すのはchar *型ですが、
b64の型は、charの配列型です。
型が違うので、コンパイラが不正と判断したのかもしれません。

とするとbcc32でなぜ通ったかが問題になるのですが…。
C言語規格でも、ポインタ同士の引き算のところは
ややこしくなっています。
規格解釈の違いがあるのかもしれません。

Q改行までの一文字ずつのファイル読み込み

こんにちは。
C言語で現在ある入力ファイルを読み込んで計算し、
ファイルを出力するというプログラムを作成中なのですが、
ファイルを読み込む場合に、
改行までの値を一文字ずつ読み込むという作業をさせたいと思っています。
データは、
abc

defgh

ijk

.....

といった感じで入力されており、

while((c = fgetc(fp)) != '\n'){
fscanf(fp, "%c", &q[i]);
}

と書いたのですが、セグメント例外が出て強制終了してしまいます。
初歩的なことで申し訳ないのですが、教えていただきたいと思います。よろしくおねがいします。

Aベストアンサー

(1)fgetc() の時点でもう既に1文字データを読んでいるので、
fscanf() で'再度取得'することはできません。
q[i] には c の値をそのまま代入してください。

(2)i はインクリメントしなくてよいのでしょうか?

(3)行の終端 '\n' を検出して while を抜けた後、
printf 文などでそのまま表示させていませんか?
文字列 q[] の終端にヌル文字を入れる必要があります。
(q[]が予めゼロクリアされているのなら入れる必要はありません)

(4)それと、feof() でファイル終端をチェックしながらやった方がいいです。

オーバーフローを起こさない為に q[] には大きめの配列を確保してください。

char q[1024];
int i = 0, c;

while( !feof( fp ) )
{
  if( ( c = fgetc( fp ) ) == '\n' )
    break;
  q[i++] = c;
}
q[i++] = '0';

みたいな感じ。

(1)fgetc() の時点でもう既に1文字データを読んでいるので、
fscanf() で'再度取得'することはできません。
q[i] には c の値をそのまま代入してください。

(2)i はインクリメントしなくてよいのでしょうか?

(3)行の終端 '\n' を検出して while を抜けた後、
printf 文などでそのまま表示させていませんか?
文字列 q[] の終端にヌル文字を入れる必要があります。
(q[]が予めゼロクリアされているのなら入れる必要はありません)

(4)それと、feof() でファイル終端をチェックしながらやった方が...続きを読む

Q”行数のカウント”はどうすればいいのでしょうか? 

 共立出版の”プログラム言語C 第2版”p24に
以下のプログラムが書いてありますが、

#include <stdio.h>

/*入力の行数をカウント*/
main()
{
int c, nl;

nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n')

++nl;
printf("%d\n", nl);
}

これをgccでコンパイルして
./***で実行しても 何もでてきません。
更にこの実行コマンドの次に 任意のファィルを指定しても 何も実行されません。
 前のページの ”ファィルの複写” ”文字のカウント” のプログラムも こんな風に 何も実行されません。
 c言語の初歩なのでしょうが、この本の ここで つまずいては 前に 進めません。”ふつうのlinuxプログラミング”を読んでいたのですが、初歩が分からないと、理解できないと 考えて この本を読んでいました。
 このコードあたりから 実行が展開されないので 困っています。gccはfedora4のものを使用しています。
 尚、windosのcについては 関心がありません。多分ライブラィの互換がとれなくて ほとんどんのコードがエラーになってしまいます。

 共立出版の”プログラム言語C 第2版”p24に
以下のプログラムが書いてありますが、

#include <stdio.h>

/*入力の行数をカウント*/
main()
{
int c, nl;

nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n')

++nl;
printf("%d\n", nl);
}

これをgccでコンパイルして
./***で実行しても 何もでてきません。
更にこの実行コマンドの次に 任意のファィルを指定しても 何も実行されません。
 前のページの ”ファィルの複写” ”文字のカウ...続きを読む

Aベストアンサー

入力はコマンドラインでファイル名を指定する形で与えるのではなく、
リダイレクトでおこなうのではないですか?
普通に実行すると、多分キーボードからの入力待ちになりそうな気がするんですが(^Dをタイプでそれまで入力した行数が出力される)。

./a.out < 入力ファイル
cat 入力ファイル | ./a.out

のようにしてやれば良いのではないでしょうか?

QC言語 ファイルの指定された行を表示

こんにちは。
回答お願いします。
今私は作業の高効率化を目指すためプログラムを考えています。
まだぜんぜんできていませんが・・
ファイルの指定された行を表示する関数がないだろうか?
もしくは似たような方法はないだろうかと考えています。

できれば例題とともに教えていただければ幸いです。
具体的にどういう風にしたいのかというと
----test.txt-------
aaaa
bbbbb
cccccc
dddd
eeeeeeee
ffffff
-------------------
というファイルがあったとしたらgetsで4と入れてやったら
四行目のddddが表示されるようにしたいのです。
まだまだ初心者ですのでさっと考えることができません。
どうかご教授お願いします。

Aベストアンサー

★高効率を目指しているの?
・固定長データなら高効率で1行を取得できたりします。
 例えば
 ----test.txt-------
 aaaaa
 bbbbb
 ccccc
 ddddd
 eeeee
 fffff
 -------------------
 という固定長データ(5文字×6行)の場合は
 int no = 4; ←4行目を取得したい時
 fseek( fp, ((no - 1) * 7), SEEK_SET ); ←5文字+\r+\n=『7』
 fgets( buff, sizeof(buff), fp );
 ↑
 これなら行番号で指定した1行を fgets() 関数で取得可能です。
 ※なおバイナリモードでオープンして下さい。
・可変長データの場合は行の先頭のオフセット位置を最初の読み込みで管理します。
 例えば
 ----test.txt-------
 aaaa
 bbbbb
 cccccc
 dddd
 eeeeeeee
 ffffff
 -------------------
 という可変長データ(4,5,6,4,8,6文字)の場合は
 オフセット位置の配列を行数分用意します。→事前に分かれば楽ですね。行数。
 long offset[ 100 ]; ←100行だと仮定
 int max;
 
 for ( max = 0 ; !feof(fp) ; max++ ){
  if ( max >= 100 ){ ←安全対策
   break;
  }
  offset[ max ] = ftell( fp );
  fgets( buff, sizeof(buff), fp );
 }
 ↑
 ここまでがオフセット位置の読み込みです。次は読み出しです。
 int no = 4; ←4行目を取得したい時
 fseek( fp, offset[no - 1], SEEK_SET );
 fgets( buff, sizeof(buff), fp );
 ↑
 これで行番号で指定した1行を fgets() 関数で取得可能です。
 ※やっぱりバイナリモードでオープンして下さい。
・あと行数の指定時に 1~max の範囲になるように補正処理も入れたほうが良いかも。
 例えば
 if ( no < 1 ){
  no = 1;
 }
 else if ( no >= max ){
  no = max;
 }
 ↑
 こんな感じで。
・以上を参考にして下さい。
 下の『参考URL』もどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/fseek.html

★高効率を目指しているの?
・固定長データなら高効率で1行を取得できたりします。
 例えば
 ----test.txt-------
 aaaaa
 bbbbb
 ccccc
 ddddd
 eeeee
 fffff
 -------------------
 という固定長データ(5文字×6行)の場合は
 int no = 4; ←4行目を取得したい時
 fseek( fp, ((no - 1) * 7), SEEK_SET ); ←5文字+\r+\n=『7』
 fgets( buff, sizeof(buff), fp );
 ↑
 これなら行番号で指定した1行を fgets() 関数で取得可能です。
 ※なおバイナリモードでオープンして下さ...続きを読む


人気Q&Aランキング