如何将文件中的 3 个值加载到 char* 数组 (C) 中?

How to load 3 values from a file into a char* array (C)?

提问人:Slykapar 提问时间:6/9/2023 最后编辑:Slykapar 更新时间:6/10/2023 访问量:28

问:

我尝试实现一个函数,该函数打开一个 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。我以为它会立即工作,但我收到一个错误,我不知道为什么。

数组 C 文件 内存 strcat

评论


答:

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
是的,那是我的错误,发现它很好。