#1
by 駆け出し » 8年前
タイトルの通りですが、うまくいきません。セーブデータの日本語部分を読み込めない(見つけられない)のです。
セーブデータは*iniみたいな構造になっていて、
[tab=30]param = value
[tab=30]param = "string"
[tab=30]{
[tab=60]child_param = value
[tab=30]}
みたいになっています。今回うまくいかないのは
navy={
id={
id=802
type=61
}
name="大日本帝国第7艦隊"
movement_progress=8.400
override_move=yes
path={
2752
}
location=2729
logical_country="JAP"
base=9458
ship={
id={
id=3208
type=51
}
name="Hiyo"
のなかで"大日本"を見つけられない(Hiyoは見つけることができました)ことで、お手上げです。
コード
コード:
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <errno.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>
#include <vector>
#include <conio.h>
#include <Windows.h>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mbstring.h>
#define INVALID_VALUE ((unsigned)(-1))
DWORD text_find(LPCSTR source,LPCSTR search,DWORD start)
{
size_t sourcelength, searchlength;
UCHAR *p;
sourcelength = strlen(source) + 1;
searchlength = strlen(search) + 1;
if (start + searchlength > sourcelength)
return INVALID_VALUE;
if ((p = _mbsstr((unsigned char*)source + start,(unsigned char*)search)) == NULL) //strstrでも結果は同じ
return INVALID_VALUE;
return (DWORD)(strlen(source) - strlen((LPCSTR)p));
}
size_t GetFileSize(LPCSTR lpFileName)
{
struct _stat stbuf;
int fd;
_sopen_s(&fd, lpFileName, _O_BINARY,
_SH_DENYWR, _S_IREAD);
if (fd == -1) {
return INVALID_VALUE; //0xfffffff...
}
if (_fstat(fd, &stbuf) == -1) {
/* エラー処理 */
return INVALID_VALUE;
}
_close(fd);
return stbuf.st_size;
}
//
int getfiletext(LPCSTR file, LPSTR *txt)
{
FILE *fp;
CHAR *cb;
size_t s;
s = GetFileSize(file);
cb = (char*)malloc(s + 1);
fopen_s(&fp, file, "rb");
fread(cb, s, 1, fp);
fclose(fp);
*txt = cb;
return TRUE;
}
//まだでばっぐしてないです
int GetParam(LPCSTR lpSaveData, DWORD start, CHAR **loaded)
{
//その行のパラメを読み込む
DWORD max = (DWORD)strlen(lpSaveData), i;
CHAR *LoadedData;
int paramlen = 0;
for (i = start; lpSaveData[i] != '=' && max > i; i++) { Sleep(1); }
i++;
//もし"からはじまっているならi++
if (lpSaveData[i] == '\"')
i ++;
for (DWORD j = i; lpSaveData[j] != '\n' && lpSaveData[j] != '\"'; j++)
paramlen++;
if ((LoadedData = (CHAR*)calloc(paramlen + 2, sizeof(CHAR))) == NULL)
return FALSE;
memcpy(LoadedData, lpSaveData + i, sizeof(CHAR)*paramlen);
*loaded = LoadedData;
return TRUE;
}
int main()
{
CHAR *wtxt,*name;
size_t pos;
getfiletext("test.txt", &wtxt);
if (text_find("あaあああaい", "い", 0) == INVALID_VALUE)
return -1;
//まず、あたりを付ける
if ((pos = text_find(wtxt, "大日本", 0)) == INVALID_VALUE)
return FALSE;
return TRUE;
}
ーブデータを添付しておきます。引用は854872行目より数行です(解凍してください)
お手数ですが、BOMがついてしまっていたので(アカウントIDが保存されているのでそれを消すためにメモ帳で編集しました)、DLされた方はしなおしてください。
タイトルの通りですが、うまくいきません。セーブデータの日本語部分を読み込めない(見つけられない)のです。
セーブデータは*iniみたいな構造になっていて、
[tab=30]param = value
[tab=30]param = "string"
[tab=30]{
[tab=60]child_param = value
[tab=30]}
みたいになっています。今回うまくいかないのは
[quote]
navy={
id={
id=802
type=61
}
name="大日本帝国第7艦隊"
movement_progress=8.400
override_move=yes
path={
2752
}
location=2729
logical_country="JAP"
base=9458
ship={
id={
id=3208
type=51
}
name="Hiyo"
[/quote]
のなかで"大日本"を見つけられない(Hiyoは見つけることができました)ことで、お手上げです。
コード
[code]
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <errno.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>
#include <vector>
#include <conio.h>
#include <Windows.h>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mbstring.h>
#define INVALID_VALUE ((unsigned)(-1))
DWORD text_find(LPCSTR source,LPCSTR search,DWORD start)
{
size_t sourcelength, searchlength;
UCHAR *p;
sourcelength = strlen(source) + 1;
searchlength = strlen(search) + 1;
if (start + searchlength > sourcelength)
return INVALID_VALUE;
if ((p = _mbsstr((unsigned char*)source + start,(unsigned char*)search)) == NULL) //strstrでも結果は同じ
return INVALID_VALUE;
return (DWORD)(strlen(source) - strlen((LPCSTR)p));
}
size_t GetFileSize(LPCSTR lpFileName)
{
struct _stat stbuf;
int fd;
_sopen_s(&fd, lpFileName, _O_BINARY,
_SH_DENYWR, _S_IREAD);
if (fd == -1) {
return INVALID_VALUE; //0xfffffff...
}
if (_fstat(fd, &stbuf) == -1) {
/* エラー処理 */
return INVALID_VALUE;
}
_close(fd);
return stbuf.st_size;
}
//
int getfiletext(LPCSTR file, LPSTR *txt)
{
FILE *fp;
CHAR *cb;
size_t s;
s = GetFileSize(file);
cb = (char*)malloc(s + 1);
fopen_s(&fp, file, "rb");
fread(cb, s, 1, fp);
fclose(fp);
*txt = cb;
return TRUE;
}
//まだでばっぐしてないです
int GetParam(LPCSTR lpSaveData, DWORD start, CHAR **loaded)
{
//その行のパラメを読み込む
DWORD max = (DWORD)strlen(lpSaveData), i;
CHAR *LoadedData;
int paramlen = 0;
for (i = start; lpSaveData[i] != '=' && max > i; i++) { Sleep(1); }
i++;
//もし"からはじまっているならi++
if (lpSaveData[i] == '\"')
i ++;
for (DWORD j = i; lpSaveData[j] != '\n' && lpSaveData[j] != '\"'; j++)
paramlen++;
if ((LoadedData = (CHAR*)calloc(paramlen + 2, sizeof(CHAR))) == NULL)
return FALSE;
memcpy(LoadedData, lpSaveData + i, sizeof(CHAR)*paramlen);
*loaded = LoadedData;
return TRUE;
}
int main()
{
CHAR *wtxt,*name;
size_t pos;
getfiletext("test.txt", &wtxt);
if (text_find("あaあああaい", "い", 0) == INVALID_VALUE)
return -1;
//まず、あたりを付ける
if ((pos = text_find(wtxt, "大日本", 0)) == INVALID_VALUE)
return FALSE;
return TRUE;
}
[/code]
[s]ーブデータを添付しておきます。引用は854872行目より数行です(解凍してください)[/s]
[b]お手数ですが、BOMがついてしまっていたので(アカウントIDが保存されているのでそれを消すためにメモ帳で編集しました)、DLされた方はしなおしてください。[/b]