PSP xvi

PSPプログラミングを教えるブログ(本気で頑張る人アクセス大歓迎サイト)

PSP-X.gif

記事の間違いを報告  新アップローダー
記事修正情報 PSPプログラミング資料 自作ゲーム PSP用エミュレータ リンク

公認リンク
公式PSP専科 公式PSVita専科 はじめるPSPSDK PSP EXEC GAME M@STER PSP 猫山のYouTubeチャンネル

TAG
全記事にタグをつけています  http://nekoyama2gillien.blog36.fc2.com/?tag=タグ
PSP PSPプログラミング DXライブラリPortable OSLib ショートプログラム ハローワールド
PSP自作ゲーム PSP自作ソフト エミュレータ ゲームアーカイブス PSP動画
動画 初音ミク ミクミクダンス MMDドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター

このブログについて

このブログでは、非公式のPSPソフト、いわゆる自作ソフト( PSP Homebrew )を作る事を目的とします。

著作権などの こまかい利用規約については、こちらを開いてお読み下さい

このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ


当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。


このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all

スポンサーサイト 

--/--/--
--. --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[edit]

CM: --
TB: --

page top

ファイル操作編 - ファイルの読み込み処理

ファイルを、読み込みモードで 開きます。
必要なら、そのファイルのファイルサイズを計ります。
その後は、ファイルを丸ごと読み込みしたり、必要箇所だけ読み込みしたりなど、何をするかは自由です。

なお、ファイルの読み込みを終えて、もう、そのファイルにアクセスしないという場合は、その開いたファイルを閉じましょう。


では、読み込みに必要な関数を ご紹介

● 1バイト読み込み
int getc( FILE *fd );
  解説:ファイルハンドル fd から、1バイト読み込む。
      ファイルの終わりなら、-1(4バイト値0xFFFFFFFF)が得られます.

● 複数バイト読み込み(チョイ読み型)
char *fgets( char *buff, int size, FILE *fd );
  解説:ファイルハンドル fd から、(size-1) バイト読み込み、buff の指すアドレス以降へ
    読み込みした内容を格納する.
     文字列を読み出す作業に適しています.
     返り値は、ポインタ *buff のアドレス (正常時)
           0 (ファイルの終わり時)
          -1 (エラー時)
    更に、読み込みした内容が、テキストの文字列だった場合、
    文字列の終わりに、[CR][LF][0x00]という3バイトコードが付加されます。
    情報提供 = 憂煉さん 詳細は、この記事のコメントを読んで下さい。


● 複数バイト読み込み( 一気読み型 / FILE *fd 版 )
int read( FILE *fd, char *buff, int size );
  解説:ファイルハンドル fd から、size バイト読み込み、buff の指すアドレス以降へ
    読み込みした内容を格納する.
     バイナリデータを一気に読み込む作業に適しています.
     返り値は、実際に読み込まれたバイト数(正常時)
           0 (ファイルの終わり時)
          -1 (エラー時)

● 複数バイト読み込み( 一気読み型 / read( ); の int fd 版 )
int sceIoRead( int fd, char *buff, int size );
  解説:ファイルハンドル fd から、size バイト読み込み、buff の指すアドレス以降へ
    読み込みした内容を格納する.
     バイナリデータを一気に読み込む作業に適しています.
     返り値は、実際に読み込まれたバイト数(正常時)
           0 (ファイルの終わり時)
          -1 (エラー時)


いっぽう、読み込み中に、データの読み飛ばし(スキップ)をしたい場合もあるかと存じます。
そんな時は、シーク関数を使うと便利です。


● 指定バイト数の読み飛ばし( FILE *fd版 )
fseek( FILE *fd, long, SEEK_CUR );

例:15バイト分、読み飛ばす。
fseek( fd,15, SEEK_CUR );

例:38バイト分、読み飛ばす。
fseek( fd, 38, SEEK_CUR );

解説
使用例を見てもらえば、良く解かるかと。
第2パラメータで、読み飛ばすバイト数を指定。


● 指定バイト数の読み飛ばし( int fd版 )
sceIoLseek( int fd, long, SEEK_CUR );

例:21バイト分、読み飛ばす。
sceIoLseek( fd, 21, SEEK_CUR );

解説
第2パラメータで、読み飛ばすバイト数を指定。


尚、ファイルの終わりの事を、専門用語で [EOF] (= いー・おー・えふ )と言います。
End Of File の略です。

【 関連記事 】
PSPプログラミング ファイルを開く手順をM@STERしよう!
PSPプログラミング ファイルサイズの取得をM@STERしよう!
PSPプログラミング メモリの確保(割り当て)をM@STERしよう!
PSPプログラミング ファイルの読み込みをM@STERしよう!
PSPプログラミング ファイルを閉じて・・・・・。
PSPプログラミング 忘れちゃダメよ!メモリの解放

関連記事
スポンサーサイト

[edit]

CM: 8
TB: 0

page top

この記事に対するコメント

ふむふむ・・・
例があってわかりやすいです。
解説ありがとうございます^^

solve #- | URL | 2009/09/26 12:08 * edit *

次は

ファイルを閉じるのだだだっ

猫山猫宗 #0DT7YplU | URL | 2009/09/26 12:31 * edit *

猫山さんっ
fgetsは改行文字を見つけるとそこで読み取りを終了しますよっっっ
しかも、正常終了時にNUL文字を末尾につけてくれる優れモノなのです♪

憂煉 #- | URL | 2009/09/26 22:14 * edit *

ほうほう。

[CR]+[LF]+[\0] の3バイトですか。
確か、標準の C++ が、そういう仕様だったかと。

ちょっくら調べてみます。

猫山猫宗 #0DT7YplU | URL | 2009/09/27 10:17 * edit *

たぶん、この辺の記事かと思うのですが・・・。
ファイルをコピーする方法をご教授していただけませんか?
SceIoOpen、SceIoRead、SceIoWriteを使えばできそうなのはなんとなくわかったのですが・・・。

ksm12 #- | URL | 2010/03/19 20:28 * edit *

はいさーい

なんか関数の説明だけで実用向きではないブログかもっ(汗)
いつか、コピーと削除とリネームの各方法を追加しようっと(^^;;;


では、答えを書かれると創作意欲が無くなると思うので、ヒントだけ

1.メモリを確保する
2.ファイルを「読み込み用」「書き出し用」の2種類 開く
3.ファイルを一気 読み込みしてメモリへ保存
4.「3.」で読み込みした内容をファイルへ一気 書き出し
5.ファイルを閉じる
6.メモリを解放する

注意するのは、バイナリモードで読み書きしなければならない点。
何故なら、テキストモードだと NULL文字の後に0x0d(CR:復帰)
+0x0a(LF:改行)の2バイトが追加されちゃうから。

これでやってみて下さい

猫山猫宗 #jjrqi.Ao | URL | 2010/03/19 23:49 * edit *

ヒントありがとうございました。

1バイトずつ読み書きすれば確実にコピーできるのですが、スピードが遅く使い物にならないので、適当に128バイトずつ読み書きしてみたのですが・・・。
今度はファイルサイズが合わなくなりました。
ファイルサイズが合わせる処理も考えたのですが、どうもうまくいかないのですorz
模範解答頂けたら幸いです。

ksm12 #- | URL | 2010/03/21 12:41 * edit *

ヒントその2

// ファイルコピー処理
// これでもまだ手抜きです
//
#include <pspkerneltypes.h>
#include <pspiofilemgr.h>
#include <stdlib.h>
#include <alloc.h>

int FileCopy(const char *InFile, const char *OutFile)
{
  int rfp, wfp; // ファイルハンドル
  int fsize // ファイルサイズ格納用
  char *ptr; // メモリ確保用のポインター変数 兼、メモリハンドル用

  rfp = sceIoOpen(InFile, ~~); // エラーチェック必要
  wfp = sceIoOpen(OutFile, ~~); // エラーチェック必要

  fsize = GetFileSize( rfp ); // 無いので作ってね
  ptr = malloc( fsize ); // メモリの確保
  if(ptr == NULL) // メモリの確保が出来なかったら、以下
  {
    free(ptr); // メモリの解放
    sceIoClose(rfp); // 閉じる
    sceIoClose(wfp); // 閉じる
    return (エラー値); // -1 とか
  }

  sceIoRead(rfp, ptr, fsize);
  sceIoWrite(wfp, ptr, fsize);

  sceIoClose(rfp); // 閉じる
  sceIoClose(wfp); // 閉じる

  free(ptr); // メモリの解放

  return (正常値); // 0 とか
}

PSPの内部メモリの制限上、20MBくらいまでのファイルしかコピーできません。

エラー判断が少な目です。増やすべしッ!

猫山猫宗 #jjrqi.Ao | URL | 2010/03/21 16:47 * edit *

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://nekoyama2gillien.blog36.fc2.com/tb.php/151-311d34c5
この記事にトラックバックする(FC2ブログユーザー)

page top


h o m e |


 

2017-09