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

メモリースティック内のファイル書き換えの方法


ファイルの書き換えは、2通りの場合について解説します
(1) ファイルサイズが変わらない場合(前の記事で紹介
(2) ファイルサイズが変わる場合(この記事で紹介


>> (2) ファイルサイズが変わる場合

異なるデータ長へ書き換えするという条件
書き換えする前と後で、デバイス上のファイルの長さが変わってしまう場合です。

この場合の、ファイル書き換え方法の手順(日本語)

1. 書き換えるファイルを、読み書きモードで開きます
2. 更に、書き換えるファイルを、読み出しモードでも開きます
3. 書き換えする行まで、読み飛ばします
4. 書き換え済みかチェックします
5. 未書き換えなら、以下の作業をします
6. 書き換えする行の、次の行を読み込みます
7. 書き換えるデータ(行)を書き込みます
8. 6.で読み込みしたデータ(行)を書き込みます
9. [EOF]まで、データの切り詰め処理(書き直し)をします
10. 書き換え後のファイルサイズを取得します
11. 実際のファイルサイズを取得します
12. ファイルを閉じます
13. 書き換え後のファイルサイズが書き換え前より長くなった場合は、ここでおしまい
   (書き換え後のファイルサイズが書き換え前より短くなる場合は、下記を行なう)
14. メモリを確保して、ファイルをメモリに読み込んでから書き出す
15. メモリを解放して、ファイルを閉じます

上記を C++プログラミングしてみます


この関数のコピペ&利用&改造は、ご自由にどうぞ。

#include <stdio.h>
#include <malloc.h>

// テキストファイルを書き換える関数のサンプル
int File_Kakikae(filename, posLine, before, after)
// 引数の説明とか
const char *filename; // 書き換えを行なうファイルのPATH
int posLine; // 書き換えを行なう行の行番号(最初を1行目として計算)
const char *before; // 書き換え前の文字列へのポインタ
const char *after; // 書き換える文字列へのポインタ
{
char buff[256]; // 作業用のバッファ

FILE *fpRW = fopen(filename, "r+"); // 読み書き
FILE *fpR = fopen(filename, "r" ); // 読み出し
if( (fpRW == NULL) || (fpR == NULL) )
return -1; // ファイルが開けないエラー

int i;
for(i=1; i<posLine; i++) { // ループ(書き換えをおこなう行の手前まで)
fgets(buff, 256, fpRW); // 読み飛ばし
}
fseek(fpR, ftell(fpRW), PSP_SEEK_SET); // 読み出し位置をコピペ
fgets(buff, 256, fpR); // 1行 読み出し
if(strcmp(buff, before) == NULL) // 書き換え前か?
{ // 書き換え前なら以下を実行
fgets(buff, 256, fpR); // 書き換える行の、次の1行を読み出し
fputs(after, fpRW); // データを書き換える
fputs(buff, fpRW); // 先ほど読み出しておいた1行を書き込む

while(fgets(buff, 256, fpR) != NULL) { // 次の1行を読み出し
fputs(buff, fpRW); // 1行 書き込み(複写)
} // [EOF]まで繰り返し
}
else
{ // すでに書き換え済みだったら、何もせずにリターン
fclose(fpRW); // ファイルを閉じます
fclose(fpR ); // ファイルを閉じます
return 0; // すでに書き換え済みなのでエラーでは無い
}

long offset = ftell(fpRW); // 書き換え後のファイルサイズを取得
long fsize;
fseek(fpRW, 0, SEEK_SET);
fseek(fpRW, 0, SEEK_END);
fsize = ftell(fpRW); // 実際のファイルサイズを取得

fclose(fpRW); // ファイルを閉じます
fclose(fpR ); // ファイルを閉じます

if(fsize > offset) // ファイルサイズが短くなる場合への対処を以下に
{ // ここから、trancate( ) 関数のような処理(ファイルを短くする)
char *ptr; // メモリ確保用のポインター変数 兼、メモリハンドル用
int fp;

ptr = malloc( offset ); // メモリの確保をやってみる.
if(ptr == NULL) // メモリの確保が出来なかったら、以下
{
free(ptr); // メモリの解放.
return -1; // メモリが確保できなかったエラー
} // でも書き換えは成功しています。ファイルの末尾にゴミ付着エラー
fp = sceIoOpen(filename, PSP_O_RDONLY, 0777); // 読み出して
sceIoRead(fp, ptr, offset);
sceIoClose(fp);
fp = sceIoOpen(filename, PSP_O_WRONLY, 0777); // 書き込む
sceIoWrite(fp, ptr, offset);
sceIoClose(fp); // 閉じるとファイルが短くなる

free(ptr); // メモリの解放.
}
return 0; // 正常終了
}

(注) PSPSDKに、truncate( ) 関数が無かったので、代用処理を作ってみました。


【 ファイル "ms0:/重要文書.txt" の 5行目の文字列 "BEFORE\n" を "XYZ\n" に書き換える例 】
File_Kakikae("ms0:/重要文書.txt", 5, "BEFORE\n", "XYZ\n");


この関数の長所と問題点
○ 書き換える行を指定しているのは、他の行にも同じ文字列がある場合を想定しているからです。
○ 書き換えられているか確認してから書き換えるのは、念のためです。(^^;;;
× パラメータのエラーチェックは行なっていないのです。手抜きです。
× 短い文字列に書き換えを行なう場合、ファイルサイズが 32MB 以上だと、
 ファイルの末尾にゴミが残ります(ファイルがメモリに読み込めないため)。


【 関連記事 】
PSPプログラミング ファイルを開く手順をM@STERしよう!
PSPプログラミング ファイルサイズの取得をM@STERしよう!
PSPプログラミング メモリの確保(割り当て)をM@STERしよう!
PSPプログラミング ファイルの読み込みをM@STERしよう!
PSPプログラミング ファイルを閉じて・・・・・。
PSPプログラミング 忘れちゃダメよ!メモリの解放
PSPプログラミング メモリースティック内のファイル書き換え方法 その1
PSPプログラミング メモリースティック内のファイル書き換え方法 その2

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

[edit]

CM: 0
TB: 0

page top

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

page top

コメントの投稿

Secret

page top

トラックバック

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

page top


h o m e |


 

2017-10