0

我正在尝试从文本文件中读取数据并将其存储在具有一个字符指针和一个 int 变量的结构中。在从文件中获取数据的过程中,我知道将要获取一个字符串和一个整数值。我也知道我必须开始获取的位置表格。我不知道字符串的大小。那么,如何为该字符串分配内存。示例代码在这里:

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);

在此先感谢您的帮助。

4

4 回答 4

0

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

于 2012-06-01T07:07:07.913 回答
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);
于 2012-06-01T07:11:30.530 回答
0

任何一个

  1. malloc 最大可能长度
  2. 将这么多读入 malloc'd 块
  3. 找出字符串的真正结尾在哪里
  4. 将 a\0写入您的 malloc'd 块中,以便它作为一个以 nul 终止的字符串正确运行(和/或保存长度以防万一您需要它)
  5. 可选择将您的块重新分配到正确的大小

或者

  1. malloc长度的合理猜测N
  2. 读了那么多
  3. 如果在该缓冲区中找不到字符串的结尾:
    1. 使用 realloc 将缓冲区增加到2N(例如)并将接下来的N个字节读入末尾
    2. 转到 3
  4. 写一个\0等如上

你在评论中说最大。字符串长度是有界的,所以第一种方法可能很好。你还没有说你如何确定字符串的结尾,但我假设有一些分隔符,或者它是用空格填充的,或者其他东西。

于 2012-06-01T07:15:17.253 回答
0

我假设您使用 fseek 以二进制模式打开文件。

您可以使用从文件中读取,fgetc()因为您不知道大小只是分配一个初始大小为 100 的缓冲区,然后逐个字符地读取字符,将它们放入缓冲区中。监视缓冲区是否足够大以容纳字符,如果不是realloc(),则缓冲区更大。

于 2012-06-01T07:26:25.937 回答