2012-06-01 35 views
0

我正在尝试从文本文件中读取数据&将其存储在具有一个char指针的结构中& int变量。 从文件中获取数据期间,我知道将有一个字符串来获取一个整数值。 我也知道位置表单,我必须开始提取。 我不知道的是字符串的大小。 那么,我该如何为该String分配内存。 示例代码是在这里:在您的帮助如何动态地为字符串分配内存?

struct filevalue 
{ 
char *string; 
int integer; 
} value;  
fseek(ptr,18,SEEK_SET);//seeking from start of file to position from where I get String 
fscanf(ptr,"%s",value.string);//ptr is file pointer 

fseek(ptr,21,SEEK_CUR);//Now seeking from current position 
fscanf(ptr,"%d",value.integer); 

感谢。

+0

家庭作业,对吧? – 2012-06-01 07:03:45

+0

不能工作的人只能工作 – tod

+0

您需要知道所需的长度,然后使用'malloc()'并记住为空终止符添加一个。 – hmjd

回答

0

要么

  1. malloc的最大可能长度
  2. 读取多入malloc分配块
  3. 弄清楚其中所述串的实际端是
  4. 写信\0到你的malloc分配块存在,因此正确地表现为一个空终止字符串(和/或过保存长度的情况下,你需要它)
  5. 可选ReAlloc如果您的块大小正确

或者

  1. 的malloc合理瞎猜ñ的长度
  2. 读那么多
  3. 如果你不能找到结束字符串在缓冲区:
    1. 成长与realloc的缓冲区2N(例如),并读取下一个Ñ字节到结束
    2. 转到3
  4. 写信\0等等如上

你在该评论说最大。字符串长度是有界的,所以第一种方法可能很好。你还没说你怎么找出其中的字符串结尾,但我假设有一些分隔符,或者它是正确的,充满了空间,或什么的。

+0

我没有说最大。字符串大小是有限的,但我可以使用你的想法,因为在我必须访问的每个文件中都有一个通用模式,我发现在每个字符串(我需要)后都有一个换行符。我可以检查它,可以计算长度。 – tod

0

在第二个fseek()中是否指SEEK_CUR?如果是这样,那么你知道字符串的长度。使用固定大小的缓冲区。

+0

需要在文件中转义的文本是固定长度的 – tod

+0

所以当我得到字符串后,我可以从那个位置寻找从我必须取整数值的位置。我的意思是字符串和Integer之间的距离是固定的,但字符串长度不固定。 – tod

+0

字符串长度不固定*但是*有一个已知的上限 - 它不能比已知的字符串开始和已知的整数开始之间的间隔长。因此,假设最坏的情况和数组大小的硬编码。 – 2012-06-01 09:21:56

0

如果知道该第一结构的位置,并且所述第二结构的位置,你也知道第一结构的总长度(第二的位置 - 的第一位置)。您还知道结构的整数部分的大小,因此您可以轻松计算字符串的长度。

off_t pos1; /* Position of first structure */ 
off_t pos2; /* Position of second structure */ 

size_t struct_len = pos2 - pos1; 
size_t string_len = struct_len - sizeof(int); 
+0

我知道从字符串结束到文本开始的整数&文件开始字符串的大小。但从文件开始到整数值开始的文本大小再次是不确定的。 – tod

0

我假设你用二进制模式打开文件,因为你使用fseek。

你可以使用fgetc()从文件中读取,因为你不知道大小只是分配一个像100这样的初始大小的缓冲区,然后通过char读取char将它们放入缓冲区。监视缓冲区是否足够大以容纳字符,如果不是,则缓冲区设置为较大的大小。