C ++ 2010中的文本文件数组

时间:2015-09-11 14:23:54

标签: c++ arrays

我有8个文本文件(存在于我的程序文件中),我想将它们分配到一个数组中。但我遇到这个错误: (类型“char *”的值不能用于初始化“int”类型的实体)。 我的每个文件最多包含15个字符

char *ArrTemp[8][15];//[number of strings][max size of every string]
char temp1[] = "temp1.txt"; 
char temp2[] = "temp3.txt";
char temp3[] = "temp5.txt";
char temp4[] = "temp7.txt";
char temp5[] = "temp9.txt";
char temp6[] = "temp11.txt";
char temp7[] = "temp13.txt";
char temp8[] = "temp15.txt";
ArrTemp[8][15] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};

3 个答案:

答案 0 :(得分:0)

该行

ArrTemp[8][15] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};

不对。它不是初始化。它试图将RHS分配给LHS。

删除行

char *ArrTemp[8][15];//[number of strings][max size of every string]

然后,使用:

char* ArrTemp[8] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};

或只是

char* ArrTemp[] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};

答案 1 :(得分:0)

在前面的示例中,变量ArrTemp被声明为char指针,但用作二维char数组,这会引发错误。您可以尝试使用指针数组来存储不同长度的字符串。请参考以下代码:

char temp1[] = "temp1.txt";
char temp2[] = "temp3.txt";
char temp3[] = "temp5.txt";
char temp4[] = "temp7.txt";
char temp5[] = "temp9.txt";
char temp6[] = "temp11.txt";
char temp7[] = "temp13.txt";
char temp8[] = "temp15.txt";

char *ArrTemp[] = {temp1,temp2,temp3,temp4,temp4,temp6,temp7,temp8};

答案 2 :(得分:0)

这里有一堆误解没有得到解决。但首先,大象:

std::string更安全,几乎让所有这些都变得容易。

char *ArrTemp[8][15];//[number of strings][max size of every string]

不会生成一个c风格的字符串数组。请注意,类型为char *。它生成一个8x15指向c风格字符串的指针数组。根据您的需要,您也可以。

char ArrTemp[8][15];

为8个14个char c样式的字符串分配存储空间(一个字符总是丢失到终止NULL)。然后,您必须将字符串复制到数组中,但您可以完全控制存储可以更改数组的内容。如果你现在还不知道文件名是什么,只是想要存储,那么这就是c风格的阵列方式。

char * ArrTemp[8];

这将创建一个包含8个指向c风格字符串的指针的数组,然后您必须指向字符串。

接下来,

char temp1[] = "temp1.txt"; 

制作一个10个字符的数组并复制" temp1.txt"进去。如果你想改变temp1,你最好记住它的10个字符,因为如果你

char * ArrTemp[] = 
{
    temp1,
    ...
}

轻松访问temp1的大小 - sizeof(temp1) - 将丢失。 sizeof(ArrTemp[0])将返回指向temp1的指针大小,可能是4或8个字节,而不是sizeof(temp1)

这意味着需要再修改一次。

char temp1[16] = "temp1.txt"; 

您必须预先定义数组的大小。注意我使用16来适应终止NULL。但16是一个丑陋的解决方案。有可能让16个中的许多人在代码中浮动,当你想要21个以后会发生什么?你必须追捕所有16个并改变它们。不是一个好主意,所以还有一点点修改:

#define MAX_STRING_LENGTH 15

char temp1[MAX_STRING_LENGTH + 1] = "temp1.txt"; 

再次,为空的+1。

但是...

如果永远不改变temp1,你可以

const char * temp1 = "temp1.txt";

然后,稍微修改一下ArrTemp就可以了

const char * ArrTemp[] = 
{
    temp1,
    ...
}

但如果你已经这样做了,那么你可以省去一些麻烦并直接在ArrTemp中定义c风格的字符串。

const char *ArrTemp[]
{
    "temp1.txt",
    "temp3.txt",
    "temp5.txt",
    "temp7.txt",
    "temp9.txt",
    "temp11.txt",
    "temp13.txt",
    "temp15.txt",
};

返回std :: string。

这使得以上所有可变 - 不可变,"我的char数组的大小是多少?"问题消失了。

std::string ArrTemp[]
{
    "temp1.txt",
    "temp3.txt",
    "temp5.txt",
    "temp7.txt",
    "temp9.txt",
    "temp11.txt",
    "temp13.txt",
    "temp15.txt",
};

你有8个字符串预先加载到ArrTemp中。字符串可以更改。弦的长度并不重要。如果你试图溢出std :: string,它会变大。你可能不得不从RAM中运行计算机以超越它的容量。您可以利用std :: string的工具库(如+)进行追加,并=进行分配。

更清洁,更易于使用。