提问人:Slykapar 提问时间:6/9/2023 最后编辑:Slykapar 更新时间:6/10/2023 访问量:28
如何将文件中的 3 个值加载到 char* 数组 (C) 中?
How to load 3 values from a file into a char* array (C)?
问:
我尝试实现一个函数,该函数打开一个 obj 文件并从第二个字符开始循环一行中的每个字符,因为第一个和第二个字符只是代表顶点的“v”。不知何故,我收到访问冲突错误。代码如下:
bool LoadFromObjectFile(char* filepath) {
FILE* pF;
fopen_s(&pF, filepath, "r");
if (pF == NULL)
return false;
char buffer[128];
while (fgets(buffer, sizeof(buffer), pF) != NULL) {
if (buffer[0] == 'v') {
int currCoord = 0;
char* vCoords[3] = { "", "", ""};
for (int i = 2; i < sizeof(buffer); i++) {
if (buffer[i] == ' ') {
currCoord++;
continue;
}
strcat_s(vCoords[currCoord], sizeof(&buffer[i]), &buffer[i]);
}
}
}
printf("%s\n", buffer);
fclose(pF);
return true;
}
我尝试使用 strcat 函数将当前字符添加到其中一个 vCoords。我以为它会立即工作,但我收到一个错误,我不知道为什么。
答:
1赞
n. m. could be an AI
6/10/2023
#1
char* vCoords[3] = { "", "", ""};
你已经有了一个很好的三个指针数组来字符串文本。
strcat_s(vCoords[currCoord], sizeof(&buffer[i]), &buffer[i]);
您正在尝试在此处修改字符串文本。这是不允许的。即使你可以修改一个字符串文本,但你不能,你使用的在几个级别上是完全错误的,而且你的字符串文本足够大,可以包含一个空字符串,没有其他任何东西。sizeof(&buffer[i])
实际上根本不清楚你想做什么。循环似乎没有任何可见的效果。您只需在循环后打印文件的最后一行即可。这就是您的函数所做的一切。
如果你,正如我的猜测,想从每行中提取三个空格分隔的标记,你可以用这个函数来执行这个操作,以这种近似的方式(警告,未经测试的代码):strtok
char vCoords[3][128];
char* start = buffer + 2;
char* token = strtok(buffer, " ");
for (int token_idx = 0; token_idx < 3 && token != NULL, ++token_idx)
{
strcpy(vCoords[token_idx], token);
token = strtok(NULL, " ");
}
当然,你想用 做点什么,否则你可以用一对空的大括号替换这个函数。vCoords
评论
0赞
Slykapar
6/10/2023
该功能尚未完成,这只是一个我无法找到答案的问题。
0赞
Slykapar
6/10/2023
完整的函数应读取.obj文件。其中包含顶点坐标等的数据,如果一条线以“v”开头,则接下来的三个值是顶点坐标。这就是我正在努力做的。
0赞
Slykapar
6/10/2023
你给我的代码有效,但我只需要将“ char* token = strtok(buffer, ” “); ” 更改为 “ char* token = strtok(start, ” “); ”。但我认为这也是你的本意,你只是犯了一个错误。
0赞
n. m. could be an AI
6/10/2023
是的,那是我的错误,发现它很好。
评论