0

構造体で文字列 (char*) を操作できません。私も欲しい正しいデータを呼び出すことができないようです。

その下processFileに構造体メンバーが正しく表示されます。その下mainにはありません。

これが私のコードです:

#include <iostream>
#include <io.h>
#include <string>
#include "dirent.h"
#include "Stream.h"
#include "Compression.h"
#include "Definitions.h"

using namespace std;
using namespace System::IO;
using namespace System::Funcs;

bool isRawfile(char* ext);
void ProcessDirectory(string directory);
void ProcessFile(char* file);
void ProcessEntity(struct dirent* entity);

typedef struct
{
    char *name;
    int usize;
    int csize;
    BYTE *data;
} rawfile;

string path = "";
string source;
int numrawfiles = 0, numstringtables = 0;
rawfile *rawfiles = new rawfile[0x400];

FILE * zone = fopen( "C:\\Users\\jake\\Desktop\\patch_mp.zone" , "wb" );

int main(int argc, char **args)
{
    if(args[1] != NULL)
    {
        source = string(args[1]) + "\\"; //maybe move under else here..
        if(strchr(args[1], '.') != NULL)
        {
            cout<<"Unable to compile files, please drag a folder to compile."<<endl;
            cin.get();
            return 0;
        }
        else
        {
            int header[] = {1,0,0x3B4,0,0,0,1,0,0x1000,0,0,0,-1};
            for(int i=0; i<13; i++)
                fwrite(Converter::Int32ToBytes(header[i]), 1 , 4 , zone );

            ProcessDirectory(args[1]);

            for(int i=0; i<numrawfiles; i++)
                cout<<"Name: "<<rawfiles[i].name<<" Length: "<< rawfiles[i].usize << " - in main()"<<endl;

            fclose(zone);
        }
    }
    else
    {
        cout<<"No folder selected to compile. Press any Key to quit."<<endl;
        cin.get();
        return 0;
    }
    cin.get();
    return 0;
}

void ProcessDirectory(string directory)
{
    string dirToOpen = path + directory;
    auto dir = opendir(dirToOpen.c_str());
    path = dirToOpen + "\\";
    if(NULL == dir)
    {
        cout << "could not open directory: " << dirToOpen.c_str() << endl;
        return;
    }
    auto entity = readdir(dir);
    while(entity != NULL)
    {
        ProcessEntity(entity);
        entity = readdir(dir);
    }
    path.resize(path.length() - 1 - directory.length());
    closedir(dir);
}

void ProcessEntity(struct dirent* entity)
{
    if(entity->d_type == DT_DIR)
    {
        if(entity->d_name[0] == '.')
            return;

        ProcessDirectory(string(entity->d_name));
        return;
    }

    if(entity->d_type == DT_REG)
    {
        string fullpath = path + entity->d_name;
        ProcessFile(const_cast<char *>(fullpath.c_str()));
        return;
    }
    cout << "Not a file or directory: " << entity->d_name << endl;
}

void ProcessFile(char* file)
{
    char* extension = strrchr(file, '.');

    if(isRawfile(extension))
    {
        rawfile raw;
        raw.name = (char *)&file[source.length()];
        raw.usize = File::getFileSize(file);
        rawfiles[numrawfiles] = raw;
        cout<<"Name: "<<rawfiles[numrawfiles].name<<" Length: "<< raw.usize << " - in ProcessFile()"<<endl;
        fwrite(Converter::Int32ToBytes(0x23),1,4,zone);
        fwrite(Converter::Int32ToBytes(-1),1,4,zone);
        numrawfiles++;
    }
}

bool isRawfile(char* ext)
{
    char *exts[11] = {".gsc",".cfg",".txt",".news",".png",".vision",".rmb",".script",".arena",".atr",".csc"};
    for(int i=0; i<10; i++)
        if(strncmp(ext,exts[i],strlen(exts[i]))==0)
            return true;
    return false;
}

ここに例の写真があります:http://puu.sh/2vYt7/7698fd05f1

私は何を間違っていますか?

4

3 に答える 3

4

を使用することで、多くの問題を解決できますstd::string

#include <string>
struct thing
{
   std::string name;
   int age;
};

動的に割り当てられた配列を回避することもできます。

#include <vector>
std::vector<thing> things(3);
于 2013-04-07T21:22:40.857 に答える
0

実際の文字列ではなく、「Ben」のメモリ アドレスを出力しています。使用する必要があります

cout << things[1]->name << endl;

これはシンタックスシュガーです

cout << (*things[1]).name << endl;
于 2013-04-07T21:21:00.113 に答える