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
的值存储在文件中
那么您希望如何正确打印内部文件。
你的代码有很多问题。
你 malloc()
6 个变量并且从不使用它们中的任何一个,并且你不检查 malloc()
是否成功。
你永远不会调用 fclose()
或 fflush()
所以你可能在数据刷新到磁盘之前看到了文件。
您将所有 *Vertex
(rightVertex
除外)变量 malloc()
重新分配给同一个指针 vertex
,这意味着
- 您正在导致内存泄漏。
- 您正在为单个指针使用 6 个变量。
所有 *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。
我遇到一个奇怪的问题,函数内有一个 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
的值存储在文件中
那么您希望如何正确打印内部文件。
你的代码有很多问题。
你
malloc()
6 个变量并且从不使用它们中的任何一个,并且你不检查malloc()
是否成功。你永远不会调用
fclose()
或fflush()
所以你可能在数据刷新到磁盘之前看到了文件。您将所有
*Vertex
(rightVertex
除外)变量malloc()
重新分配给同一个指针vertex
,这意味着- 您正在导致内存泄漏。
- 您正在为单个指针使用 6 个变量。
所有
*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。