ファイルのアクセス位置を最後から7行目に移動させるプログラムを作っています。
\nを数えることで行数を数えているのですが、以下の処理、間違えていますか?
コンパイルしてもできていないので間違えていることは明白なのですが、どこが違うかわかりません。
誰か、力になってください!
fseek(fp, -1, SEEK_END);/*読込位置最後にする */
while(!fseek(fp, -2, SEEK_CUR))/*逆順読込ループ*/
{
if(getc(fp)=='\n')
{cnt++;}
if(cnt == 7)
{break;}
}
No.5ベストアンサー
- 回答日時:
こんな感じはどうでしょうか。
FILE *fp;
char c;
int cnt=0;
int cr_lf=0;
fp = fopen("hoge.txt", "r");
fseek(fp, -1L, SEEK_END);
do {
c=getc(fp);
if(cr_lf==0 && (c==0x0D || c==0x0A)){
cnt++;
cr_lf=1;
} else cr_lf=0;
if(cnt==7) break;
} while(fseek(fp, -2L, SEEK_CUR)==0);
fclose(fp);
No.4
- 回答日時:
テキストストリームの場合、fseek関数はSEEK_CURでもSEEK_ENDでもオフセットには0しか指定できません。
というのも、ファイルに格納されている一文字と、プログラムから読み込んだときの一文字が、(文字数も値も)必ずしも対応しないからです。そのため、前から読まないと辻褄が合わなくなります。
典型的なものとしては改行文字で、例えばWindowsでは、ファイルには{ '\r', '\n' }の二文字が格納されているものが、プログラムから読み込むと{ '\n' }一文字になります。fseek関数でオフセットを指定する場合、普通はファイル上でのバイト数を指定する必要があるので、改行文字のところではオフセットを2に数えなければなりません。
他にも、処理系によってはロケール等に応じて更に状態が変化する可能性があります。
バイナリストリームの場合、上記のような問題はありませんが、今度はSEEK_ENDを指定しても、ファイルの終端に位置づけられる保証がなくなります。
つまり、結局は先頭から読んでいく以外に方法はありません。
なお、処理系を特定した場合にはこの限りではありません。
No.3
- 回答日時:
ちょっと見ただけですが、疑問に思った箇所があったのでソースを直してみました。
int r;
fseek(fp, 0L, SEEK_END);
r = fseek(fp, -1L, SEEK_CUR);
while(!r)
{
if(getc(fp)=='\n')
{cnt++;}
if(cnt == 7)
{break;}
r = fseek(fp, -2L, SEEK_CUR);
}
つまり、初回はまだ読んでないのでポインタを一つ戻すだけでよいのでは。
No.2
- 回答日時:
\nは 0Dhと0Ahの複合になりますね。
(CRとLF)
ですので、キャラクタで判定するなら、バイナリの0x0Dなどで行ってみては如何でしょうか?
自信はありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:02
- Visual Basic(VBA) VBA初心者です。 VBAで行単位で条件付き書式の色をカウントしたいです。 大量のデータがあるExc 3 2022/06/08 10:00
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSで指定行に挿入
-
テキストファイルの行数を取得...
-
freadとfwrite
-
C/C++ ファイル入出力操作 (長...
-
改行までの一文字ずつのファイ...
-
バイナリファイルをテキストフ...
-
VS2010 MFC CStdioFileについて
-
C言語 バイナリファイルの読み...
-
fopenで開いたファイルのサイズ...
-
テキストファイルの先頭への文...
-
ハフマン符号のプログラム
-
複数テキストファイルを読み込...
-
winsock recvでの文字化け
-
fseekの使い方
-
0バイトファイルの作成
-
EOF判定されない
-
ファイル内のデータを1行削除...
-
【VB.Net】バイト型配列に読み...
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
VBSで指定行に挿入
-
fgetsで2行目から文字化け
-
テキストファイルの行数を取得...
-
ファイルサイズ指定し、ファイ...
-
巨大なテキストファイル(可変...
-
【VB.Net】バイト型配列に読み...
-
fopenで開いたファイルのサイズ...
-
改行までの一文字ずつのファイ...
-
freadとfwrite
-
c言語 2つのファイルを行ご...
-
0バイトファイルの作成
-
fopen(書き込みモード)でファイ...
-
テキストファイルの先頭への文...
-
テキストファイルの文字列の削除
-
C言語での採番について
-
VS2010 MFC CStdioFileについて
-
続・EOF判定されない
-
C言語での改行コードの扱いにつ...
おすすめ情報