在C中设置指向字符串的指针

时间:2018-01-17 10:36:05

标签: c arrays pointers

我有一个数组(POINTS),其长度大于&n; 20M以下结构(点),并希望将其保存在二进制文件中,然后在另一个程序中读取它:

typedef struct {
  char *name;
  unsigned char namelength;  
} point;

if((POINTS = (point *) malloc (N * sizeof(point))) == NULL){        
    printf("when allocating memory for the points vector\n");
    exit(0);
}

我正在做的是以下内容;首先,我创建一个变量namestot,以了解我总共拥有多少个字符(某些名称可能为空):

for (i = 0; i < N; i++) namestot += POINTS[i].namelength;

然后我将数组写入文件中:

if ((fin = fopen(name, "wb")) == NULL){
    printf("the output binary data file cannot be open\n");
    exit(0);
}

for ( i=0; i < N; i++){
    if (POINTS[i].namelength){
        if( fwrite(point[i].name, sizeof(char), POINTS[i].namelength, fin) != POINTS[i].namelength){
            printf("when writing names to the output binary data file\n");
            exit(0);
        }       
    }
}

有了这个我创建文件没有问题。现在我们更改为保存二进制文件的另一个程序,因此我们打开并阅读它:

if ((fin = fopen (argv[1], "r")) == NULL){
    printf("the data file does not exist or cannot be opened\n");
    exit(0);
}
//Here we allocate memory again for the POINTS vector
    if((POINTS = (point *) malloc (N * sizeof(point))) == NULL){        
        printf("when allocating memory for the points vector\n");
        exit(0);
    }

if((allnames = (char *) malloc (namestot * sizeof(char))) == NULL){
    printf("when allocating memory for the names vector");  
    exit(0);
}

if (fread(allnames, sizeof(char), namestot, fin) != namestot){
        printf("when reading names from the binary data file\n");
        exit(0);
    }

//Setting pointers to names
for (i = 0; i < N; i++){
    if(POINTS[i].namelength > 0){
        POINTS[i].name = allnames; 
        allnames += POINTS[i].namelength;
    }
}   

但是,当我尝试读取第一个非空名称时,程序会打印整个名称数组,有关如何设置指向mesan的指针以获得POINTS数组的任何建议,就像我在第一个程序中一样吗?

谢谢!

PS:如果有任何未声明的变量,我可能忘记将其粘贴在此处,那不是问题。

2 个答案:

答案 0 :(得分:1)

您正在为文件编写可变长度字符串,因此当您阅读它时,您需要知道单个字符串的长度

您可以决定在文件中包含长度字符串以及要写入的字符串,或者确保写入尾随'\ 0'表示先前的字符串结尾,新的字符串从下一个字节开始,您的读者程序必须解析字符串accordngly

答案 1 :(得分:0)

  

prints整个名单

听起来好像是因为您没有告诉您的程序每个名称的结尾,请在遇到char *时停止打印\0