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 回答
0

要添加 scd 所说的内容,您没有成功取消引用 name 成员。当您尝试对 things[1].name 进行操作时,您正在对指针进行操作,这只是一个内存位置。

这是学习使用指针时最棘手的事情之一。以下是关于取消引用运算符和语法提示的更多阅读。

http://en.wikipedia.org/wiki/Dereference_operator#Other_syntax

编辑:

在自己编译之后,我意识到我在这个错误的轨道上,并且 std::cout 将正确处理 char 指针。你应该可以用你的代码解决这个问题,只要确保你给你的结构数组一个大小。

这对我有用:

#include <iostream>
#define MAXSIZE 3

typedef struct
{
   char* name;
   int age;
}Thing;

Thing *things = new Thing[MAXSIZE];

int _tmain(int argc, _TCHAR* argv[])
{
char* names[MAXSIZE] = { "Alice", "Ben", "Carlos" };
    int ages[MAXSIZE] = { 24, 25, 26 };
    for(int i=0; i<MAXSIZE; i++)
    {
        things[i].name = names[i];
        things[i].age = ages[i];
    }
    std::cout << things[1].name << std::endl;
    return 0;
}
于 2013-04-07T21:27:32.167 回答