C++ 将文件中的数据存储到C+中的二维数组中+;

C++ 将文件中的数据存储到C+中的二维数组中+;,c++,visual-c++,C++,Visual C++,我有下面的C代码++ char *Names[]; int counter=0; int _tmain(int argc, _TCHAR* argv[]) { int data; ifstream fileX; fileX.open("myfile",ios::in); assert (!fileX.fail( )); fileX >> data; while(fileX!=eof()) { createNa

我有下面的C代码++

char *Names[];
int counter=0;
int _tmain(int argc, _TCHAR* argv[])
{
    int data;
    ifstream fileX;
    fileX.open("myfile",ios::in);
    assert (!fileX.fail( )); 
    fileX >> data; 
    while(fileX!=eof())
    {
        createNamesList(data);
        fileX >> data;
    }
    return 0;
}

void createNamesList(char *tmp)
{
    Names[counter] = tmp;
    counter++;
}
我想逐行读取文件中的数据,并将每行存储在二维
数组char*Names[]
中,这样就可以保存整个列表。每行数据的大小是可变长度的,行数也是可变的; 像

上面的代码给出了以下错误

错误LNK2001:未解析的外部符号“字符**名称”(?名称@@3PaPaPada)


您的帮助将不胜感激。

您看到的错误消息仅仅是此代码问题的冰山一角

我建议您使用编译器附带的
std::vector
std::string
类来简化这个过程

int main() {
    std::ifstream fileX("myfile");

    std::vector<std::string> Names;

    std::string temp;
    while (std::getline(fileX, temp))
        Names.push_back(temp);
    return 0;
}
intmain(){
std::ifstream fileX(“myfile”);
std::矢量名称;
std::字符串温度;
while(std::getline(fileX,temp))
名称。推回(临时);
返回0;
}

char*Names[]的第一行代码是什么要做什么?@davidSchwartz获取一个二维数组,并将文件中的逐行值存储在itI中。我只是想问一下您希望第一行代码做什么。尽可能具体。@davidSchwartz字符指针数组关于字符指针数组的内容是什么?阵列有多大?您是否希望分配单个元素?如果有,有多少?(如果不了解作者的期望值,很难解释代码的错误。你是否希望它知道要分配多少项,以及每个项的大小,以便你以后填写?如果不是,你期望什么?)如果C++11可用,最好使用
Names.push\u(标准:移动(临时))
因为它的值在任何方式的推送后都会被丢弃。当c++11不可用时,每次向量需要扩展其容量时,它都会复制每个字符串的内容,这使得该方法效率极低。@c.R:充其量,有时会稍微好一点。这意味着当你阅读下一行时,
temp
has分配一个新的缓冲区,这样你在
推回
过程中得到的东西,你会立即丢失。“效率极低”纯属无稽之谈。虽然内容确实会被复制,但
向量
会以几何方式调整自身大小,因此拷贝数趋于恒定(通常约为3)。它在各种条件下经过数千次测试,性能非常可靠。我的意思是,
std::string
的复制构造函数复制整个字符串内容,而在C++11中它将被移动。例如,如果向量中字符串的平均长度为100个字符,那么每次向量重设es本身,将有100 N个拷贝操作,而不是N个拷贝。@C.R:是的,我知道你的意思。请记住,我们说的是从文件中读取数据。作为练习,请查找内存带宽,并计算一个磁盘搜索所花费的时间内可以复制多少字符串。
int main() {
    std::ifstream fileX("myfile");

    std::vector<std::string> Names;

    std::string temp;
    while (std::getline(fileX, temp))
        Names.push_back(temp);
    return 0;
}