C 编程 - fprintf 和 printf in while cicle 不起作用

C Programming - fprintf and printf in while cicle doesn't work

我遇到一个奇怪的问题,函数内有一个 while cicle。

我必须寻找 .ply 模型的极端顶点。所有数据都存储在链表中。创建完列表后,我调用 findExtremeVertex 函数,它修改 6 个全局变量(leftVertex、rightVertex、downwardVertex、upwardVertex、backVertex 和 frontVertex)。

为了查看值是否正确(我使用的模型有点太大,无法控制每一行以找到每个顶点的最大值)我决定打印最大最小值的每个变化但是,当我尝试将它们打印在一个文件中,该文件是空的。这是为什么?另外,当我看到文件为空时,我尝试直接在控制台打印一些东西,但也没有用。

函数代码如下:

void findExtremeVertex(Vertex *vertex){
    FILE *modelInfoFile;
    int i = 0;

    ///Giving data to direction-vertices pointers
    leftVertex = malloc(sizeof(Vertex));
    rightVertex = malloc(sizeof(Vertex));
    upwardVertex = malloc(sizeof(Vertex));
    downwardVertex = malloc(sizeof(Vertex));
    frontVertex = malloc(sizeof(Vertex));
    backVertex = malloc(sizeof(Vertex));

    ///Giving the direction-vertices the values of the parameter
    leftVertex = vertex;
    rightVertex = vertex;
    upwardVertex = vertex;
    downwardVertex = vertex;
    frontVertex = vertex;
    backVertex = vertex;

    ///Opening file
    modelInfoFile = fopen(us2, "w");
    if(modelInfoFile == NULL){
        printf("Error in file opening. Exiting.");
        exit(EXIT_FAILURE);
    }

    ///Scrolling the list
    while(vertex->prev != NULL){
        vertex = vertex->prev;

        ///If the given element of the list is more to the right than the global variable,
        ///I assign the values of the element to the global variable
        if(vertex->vertexCoordinates.x > rightVertex->vertexCoordinates.x){
            rightVertex = vertex;
        }

        /**
            I'm omitting the other if constructs because are basically
            the same, but the syntax is correct
        **/

        ///Printing in file the cycle information
        fprintf(modelInfoFile, "********** CYCLE %d **********\n\n", i);
        fprintf(modelInfoFile, "Vertex sx\n");
        fprintf(modelInfoFile, "%1.4f %1.4f %1.4f %1.4f %1.4f %1.4f\n\n", leftVertex->vertexCoordinates.x,
                                                                      leftVertex->vertexCoordinates.y,
                                                                      leftVertex->vertexCoordinates.z,
                                                                      leftVertex->vertexNormals.x,
                                                                      leftVertex->vertexNormals.y,
                                                                      leftVertex->vertexNormals.z);

        /**
            Again, I'm omitting some repetitions but the syntax is correct
        **/
        }
    }

我在另一个函数中调用这个函数,但是没有段错误信号,编译器什么也没告诉我,程序没有崩溃。我不知道错误的线索,除了我打印有关周期信息的文件是空的。我做错了什么?

  ///Opening file
if(modelInfoFile == NULL){
    printf("Error in file opening. Exiting.");
    exit(EXIT_FAILURE);
}

我没有看到你打开文件。

if((modelInfoFile=fopen(filename,"w")) == NULL){

应该可以。

编辑

在你的 while 循环中你改变了 -

   vertex = vertex->prev;

但在 fprintf 中,您将 leftVertex->vertexCoordinates.x 的值存储在文件中 那么您希望如何正确打印内部文件。

你的代码有很多问题。

  1. malloc() 6 个变量并且从不使用它们中的任何一个,并且你不检查 malloc() 是否成功。

  2. 你永远不会调用 fclose()fflush() 所以你可能在数据刷新到磁盘之前看到了文件。

  3. 您将所有 *VertexrightVertex 除外)变量 malloc() 重新分配给同一个指针 vertex,这意味着

    1. 您正在导致内存泄漏。
    2. 您正在为单个指针使用 6 个变量。
  4. 所有 *Vertex 变量都没有在函数内部声明,这意味着它们在全局范围内,这很可能是一个糟糕的设计选择。鉴于您发布的代码,无法判断全局变量是否是正确的选择,但 99% 的情况下它们是一个错误的选择,并且有一种更优雅和安全的方式来做事。

上面的 粗体 点可能是您的程序按原样运行的原因。

代码

leftVertex = vertex;
rightVertex = vertex;
upwardVertex = vertex;
downwardVertex = vertex;
frontVertex = vertex;
backVertex = vertex;

设置指针值而不是实际值。你 malloc space,得到一个指向那个 space 的指针,然后扔掉那个指针,将它设置为 virtex 的指针。

你的意思是使用

*leftVertex = *vertex;
*rightVertex = *vertex;
*upwardVertex = *vertex;
*downwardVertex = *vertex;
*frontVertex = *vertex;
*backVertex = *vertex;
///Scrolling the list
while(vertex->prev != NULL){
    vertex = vertex->prev;

如果在此之后 vertex 为 NULL,会发生什么情况?

您正在检查它是否为 NULL,然后更改它的值以使其变为 NULL。