我想知道是否有人可以解释如何使用动态分配的内存缓冲区中存储的数据。
我的目的是读取文本文件,并将其存储在所述缓冲区中(有效)。然后循环访问此缓冲区以收集所需的信息并将其存储在数组中。
我的程序的目的是从文本文件中获取所需的信息,并将信息,坐标分别存储在x和y数组中。
该程序与const char数组完美配合,如下所示:
const char buffer[] =
"I have(60438.0,63493.0)loads of(-2100.0,63493.0) stuff "
"(87659.0,55553.0)to copy (-70048.0,-61111.0) to strings.";
我希望现在就过去。
我可以看到缓冲区指向内存中的位置。如何使用此数据?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *buffer;
#define buffer_begin (buffer)
#define buffer_end (buffer + sizeof(buffer))
/*global variables*/
const char a = '(';
const char b = ')';
int i = 1;
long pos = 0;
FILE* file;
long numbytes;
char xdest[sizeof(buffer)];
char ydest[sizeof(buffer)];
static char* copy_itx(const char* base, size_t len, char* out) {
memcpy(out, base, len); // copy from 'base' of length 'last-first' to xptr
out[len] = '\0'; // set everything after
return out + len + 1;
}
static char* copy_ity(const char* base, size_t len, char* out) {
memcpy(out, base, len);
out[len] = '\0';
return out + len + 1;
}
/*main function*/
int main() {
// read txt file and store in calloc buffer
file = fopen("instance_info.txt","r"); /*open file*/
if(file == NULL)/* quit if the file does not exist */
return -1;
fseek(file, 0L, SEEK_END); /* Get the number of bytes */
numbytes = ftell(file);
fseek(file, 0L, SEEK_SET); /* reset the file position indicator to
the beginning of the file */
buffer = (char*)calloc(numbytes, sizeof(char)); /* grab sufficient memory for the
buffer to hold the text,
calloc clears all rubbish memory values */
if(buffer == NULL){ /* memory error */
perror("%s");
return -1;
}
fread(buffer, sizeof(char), numbytes, file); /* copy all the text into the buffer,
reads 'numbytes' number of chars */
fclose(file); //close the file
printf("%s", buffer);
i=0;
char* xptr = xdest;
char* yptr = ydest;
const char* first = NULL;
const char* last = NULL;
// GET X CORDS HERE
printf("\n");
printf("x cords:\n");
for (const char* it = buffer_begin; it != buffer_end; it++) { // for loop to iterate through buffer
if (*it == '(') { // if char pointer *it is '('
first = it + 1; // set first char equal to open bracket
last = NULL; // ensure last char still equal to a NULL char
}
if (*it == ',' && first != NULL) { // if const char pointer *it is equal to ','
//and first char isnt pointing to NULL
last = it; //set last char equal to current position
char* next = copy_itx(first, last-first, xptr); // call copy_itx function
printf("%d: %s\n", i++, xptr); // print char stored at xptr
first = NULL; // set first char back to NULL
xptr = next; // assign char pointer next to xptr
}
}
// GET Y CORDS HERE
printf("\n");
printf("y cords:\n");
i=0;
for (const char* it = buffer_begin; it != buffer_end; it++) {
if (*it == ',') {
first = it + 1;
last = NULL;
}
if (*it == ')' && first != NULL) {
last = it;
char* next = copy_ity(first, last-first, yptr);
printf("%d: %s\n", i++, yptr);
first = NULL;
yptr = next;
}
}
return 0;
}
非常感谢您的帮助。
谢谢
答案 0 :(得分:4)
通常情况下,sizeof
是编译时评估。不能将其用作某种运行时函数来获取已分配内存的大小。
执行char xdest[sizeof(buffer)];
时,您会得到一个缓冲区,大小为char*
指针(可能是4个字节),而不是与您使用malloc分配的大小相同的缓冲区。
您需要使用变量来跟踪分配的内存。如果在运行时确定有多个缓冲区具有相同的大小,则malloc分配所有缓冲区。
答案 1 :(得分:0)
在我看来,先尝试重新组织代码。
继续循环1,2,3,4,直到输入中不再引用'('。
如果要使用相同的结构,请使用不同的迭代计数器
char* it = buffer;
for (int i = 0; i < numbytes ; i++)
{
if (it[i] == ',')
{
...