我有一个方法,它接收文件列表,并获取有关文件的数据。这些文件的格式作为两个1D数组返回。我想将它们组合成一个2D数组。
文件只返回一个类型数组和一个数据数组。
这是有问题的方法。我成功地从文件和1D数组中获取了我需要的数据,但是当我尝试将它们添加到2D数组时,它会运行(但会发出警告:char *和char * [] []不等同于)。
char *ParseFiles(char *listOfFiles[32])
{
char *allFileData;
char *tmpArray[32][32];
allFileData = tmpArray;
for(int i = 0; i < listOfFiles[i]; i++)
{
int j = 0;
// Get the File Type
char *currentFileType = GetFileType(listOfFiles[i], strlen(listOfFiles[i]));
if(currentFileType)
{
// Warning char * and char *[][] are not equivalent.
tmpArray[i][j] = currentFileType;
printf("File %d is %s\n", i, currentFileType);
//printf("File %d is %s\n", i, &tmpArray[i][j]);
//free(currentFileType);
}
//Get all File Data
// Warning char * and char *[][] are not equivalent.
char *currentFileData = GetFileData(listOfFiles[i]);
j = j + 1;
if(currentFileData)
{
tmpArray[i][j] = currentFileData;
printf("File Data:\n%s\n", currentFileData);
//free(currentFileType);
}
}
return allFileData;
}
当我尝试在注释掉的printf语句中输出tmpArray[][]
值时,我会得到意外的字符(对于犯错误的人来说意外)?]p
问题是基于两个char数组的警告不是同一类型,还是因为我试图将单维数组错误地插入多维数组?
我得到的确切警告是warning: incompatible pointer types assigning to 'char*' from 'char *[32][32]'
以下是我的另外两种方法,主要是:
char *GetFileType(char *filePath, int size)
{
char *ret = malloc(size);
char currentLine[100];
FILE *file = fopen(filePath, "r");
while(fgets(currentLine, sizeof(currentLine), file) != NULL)
{
if(strstr(currentLine, "test"))
{
ret = "test";
}
else if(strstr(currentLine, "production"))
{
ret = "production";
}
}
if(!ret)
{
return NULL;
}
return ret;
}
char *GetFileData(char *filePath)
{
char *buffer = NULL;
size_t size = 0;
FILE *file = fopen(filePath, "r");
// Get the buffer size
fseek(file, 0, SEEK_END);
size = ftell(file);
// Reset the position of the stream
rewind(file);
buffer = malloc((size + 1) * sizeof(*buffer));
// Read the entire file into the buffer
fread(buffer, size, 1, file);
buffer[size] = '\0';
return buffer;
}
int main (void)
{
char *listOfFiles[32] = {"file1.txt", "file2.txt", "file3.txt"};
ParseFiles(listOfFiles);
printf("Press ENTER key to Continue");
getchar();
return 0;
}
答案 0 :(得分:1)
问题不是你说的,而是在这里:
char *allFileData;
char *tmpArray[32][32];
allFileData = tmpArray;
tmpArray
的类型为char *[32][32]
。 allFileData
的类型为char *
。作业无效。
还有更糟糕的事情发生了:你返回allFileData
指向本地变量 tmpArray
。一旦函数返回,变量tmpArray
将超出范围,并且您返回的指针将立即变为无效。将数组作为参数传递,或者在函数内动态分配。