所以我第一次使用指针进行此练习来自C ++。我的教授希望我们在不使用索引的情况下进行此练习,以便更好地掌握指针。我正在尝试从一个文件读入嵌入在动态分配的结构中的二维数组。我希望我已经足够好地提出了我的问题并提供了适当的信息。非常感谢你。
我的结构
typedef struct //struct that holds ASCII art
{
char artistName[80]; //name of artist
char asciiArt[20][80]; //actual ascii art line by line
int rating; //rating of art
}TextArt;
结构声明和分配数组
TextArt **artPtr;
artPtr = malloc(1000 * sizeof(TextArt) + 1);
代码行给我带来问题。我从文件中读到这一点很好,我不确定这段时间是否有效,我在第一个字符中寻找#。这里的语法非常混乱,不使用索引,所以这是我需要最多帮助的地方。它是指向struct(* asciiArt + i)数组的指针,然后在struct - >中。一个2d c字符串数组asciiArt [] []。
while(*tempLine != '#') //while there is no # in position [0] -- read into temp string
{
printf("while templine\n");
fgets((*asciiArt+i)->asciiArt, 100, pFile);
}
如果您需要更多信息,请从上面的代码中获取完整功能,否则请忽略此代码块。
void readFromFile(TextArt **asciiArt, int size, char *fileName)
{
int index = 0; //index for array of struct
int i = 0;
int j = 0;
char tempLine[500]; //temp placeholder
FILE *pFile;
pFile = fopen (fileName ,"r");
if (pFile == NULL)
printf("Error opening file");
else
{printf("file opened.");
for(i = 0; pFile != NULL; i++) //*(*(data + i) + j)
{ j=0;
fgets((*asciiArt+i)->artistName, 100, pFile); //get artist name from first line
printf("got artist name");
while(*tempLine != '#')
{printf("while templine\n");
fgets((*asciiArt+i)->asciiArt, 100, pFile); //while there is no # -- read into temp string
}
strcpy(tempLine, ""); //clear temp string
printf("for loop done");
}
return;
}
}
答案 0 :(得分:2)
这是一个错误:
TextArt **artPtr;
artPtr = malloc(1000 * sizeof(TextArt) + 1);
sizeof(TextArt)
与sizeof(TextArt *)
无关。 artPtr
指向指针数组,而不指向TextArt对象数组。您刚刚分配(或尝试分配)的1000个指针中的每一个当前都没有指向,并且在使用它们之前必须将每个指针指向某个位置。
更新:OP澄清了分配1000 TextArt
s数组的意图:
TextArt *artPtr;
artPtr = malloc(1000 * sizeof(TextArt));
我不确定+ 1
是什么意思。
如果readFromFile
函数需要调整数组的大小,那么你将它传递给:
void readFromFile( &artPtr, ......
并在您访问它的函数内部,如:
fgets((*asciiArt)[i].artistName, 100, pFile);
其实我会写
TextArt *artPtr = *asciiArt;
fgets( artPtr[i].artistName, 100, pFile );
因为这更容易阅读而不是在任何地方都有括号。
如果该功能不需要重新分配,那么只需使用TextArt *artPtr;
。
答案 1 :(得分:1)
可能
TextArt *artPtr;
artPtr = malloc(1000 * sizeof(TextArt));
...
void readFromFile(TextArt *asciiArt, int size, char *fileName){
int index, i, ch; //index for array of struct
char tempLine[500];
FILE *pFile;
pFile = fopen (fileName ,"r");
if (pFile == NULL)
printf("Error opening file");
else{
printf("file opened.");
for(index = 0; index < size; ++index){
TextArt *pta = asciiArt + index;
fgets(pta->artistName, sizeof(pta->artistName), pFile);
printf("got artist name");
for(i=0;i<20;++i){//20 : sizeof(pta->asciiArt)/sizeof(pta->asciiArt[0])
if(EOF==(ch=fgetc(pFile))){
index = size;//outer loop break
break;
} else if(ch == '#'){
//ungetc(ch, pFile);
fgets(tempLine, sizeof(tempLine), pFile);
break;
} else {
ungetc(ch, pFile);
fgets(pta->asciiArt + i, sizeof(pta->asciiArt[0]), pFile);
}
}
}
fclose(pFile);
}
}