仅使用指针的动态结构中具有2d数组的fscanf 所以我第一次从C++中用指针来练习这个练习。我的教授希望我们在不使用索引的情况下做这个练习,以便更好地掌握指针。我试图将文件读入嵌入动态分配结构中的二维数组。我希望我的问题措辞足够好,并提供了适当的信息。多谢各位

仅使用指针的动态结构中具有2d数组的fscanf 所以我第一次从C++中用指针来练习这个练习。我的教授希望我们在不使用索引的情况下做这个练习,以便更好地掌握指针。我试图将文件读入嵌入动态分配结构中的二维数组。我希望我的问题措辞足够好,并提供了适当的信息。多谢各位,c,arrays,pointers,malloc,scanf,C,Arrays,Pointers,Malloc,Scanf,我的结构 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 =

我的结构

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->2dc字符串数组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;
    }
}
这是一个错误:

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);
在功能内部,您可以像这样访问它:

void readFromFile( &artPtr, ......
fgets((*asciiArt)[i].artistName, 100, pFile);
事实上我会写信的

TextArt *artPtr = *asciiArt;
fgets( artPtr[i].artistName, 100, pFile );
因为这更容易阅读,而不是到处都有括号

如果函数不需要重新分配,则只需使用
TextArt*artPtr

这是一个错误:

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);
在功能内部,您可以像这样访问它:

void readFromFile( &artPtr, ......
fgets((*asciiArt)[i].artistName, 100, pFile);
事实上我会写信的

TextArt *artPtr = *asciiArt;
fgets( artPtr[i].artistName, 100, pFile );
因为这更容易阅读,而不是到处都有括号

如果函数不需要重新分配,则只需使用
TextArt*artPtr

这是一个错误:

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);
在功能内部,您可以像这样访问它:

void readFromFile( &artPtr, ......
fgets((*asciiArt)[i].artistName, 100, pFile);
事实上我会写信的

TextArt *artPtr = *asciiArt;
fgets( artPtr[i].artistName, 100, pFile );
因为这更容易阅读,而不是到处都有括号

如果函数不需要重新分配,则只需使用
TextArt*artPtr

这是一个错误:

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);
在功能内部,您可以像这样访问它:

void readFromFile( &artPtr, ......
fgets((*asciiArt)[i].artistName, 100, pFile);
事实上我会写信的

TextArt *artPtr = *asciiArt;
fgets( artPtr[i].artistName, 100, pFile );
因为这更容易阅读,而不是到处都有括号

如果函数不需要重新分配,则只需使用
TextArt*artPtr

可能

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);
    }
}
TextArt*artPtr;
artPtr=malloc(1000*sizeof(TextArt));
...
void readFromFile(TextArt*asciart,int size,char*fileName){
int index,i,ch;//结构数组的索引
字符模板[500];
文件*pFile;
pFile=fopen(文件名,“r”);
if(pFile==NULL)
printf(“打开文件时出错”);
否则{
printf(“文件已打开”);
对于(索引=0;索引artistName,sizeof(pta->artistName),pFile);
printf(“获得艺术家名称”);
对于(i=0;iasciart)/sizeof(pta->asciiArt[0])
如果(EOF==(ch=fgetc(pFile))){
index=size;//外部循环中断
打破
}else if(ch='#'){
//ungetc(ch、pFile);
fgets(模板线、尺寸(模板线)、pFile);
打破
}否则{
ungetc(ch、pFile);
fgets(pta->asciiArt+i,sizeof(pta->asciiArt[0]),pFile);
}
}
}
fclose(pFile);
}
}
可能

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);
    }
}
TextArt*artPtr;
artPtr=malloc(1000*sizeof(TextArt));
...
void readFromFile(TextArt*asciart,int size,char*fileName){
int index,i,ch;//结构数组的索引
字符模板[500]