Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C文件读取器每隔一行跳过一次_C_File_Scanf - Fatal编程技术网

C文件读取器每隔一行跳过一次

C文件读取器每隔一行跳过一次,c,file,scanf,C,File,Scanf,我的目标是在C中加载一个.obj文件,但我的问题是fscanf似乎每隔一行就跳过一行,而不是顺利地读取它。我没有收到任何错误消息。 我检查了其他问题,但我没有给fscanf打过两次电话,也没有写过其他文件阅读器中没有的东西 例如,文件中的4行如下所示: v 1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v -1.000000 -1.000000 1.000000 v -1.000000 -1.000000 -1.000000

我的目标是在C中加载一个.obj文件,但我的问题是fscanf似乎每隔一行就跳过一行,而不是顺利地读取它。我没有收到任何错误消息。 我检查了其他问题,但我没有给fscanf打过两次电话,也没有写过其他文件阅读器中没有的东西

例如,文件中的4行如下所示:

v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
但结果是:

read from file: v, 1.000000, -1.000000, 1.000000
read from file: v, -1.000000, -1.000000, -1.000000
这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/* Primary vector function */
struct vec3d {
  float x;
  float y;
  float z;
};

/* Triangle structure of 3 vectors */
struct triangle {
  struct vec3d p1;
  struct vec3d p2;
  struct vec3d p3;
};

/* function to load an object file */
int main (){

    struct vec3d verts[256];
    struct triangle tris[256];
    int lastVertIndex = 0;
    int lastTriIndex = 0;

    FILE* fp;
    fp = fopen("cube.obj", "r");
    if (fp == NULL){
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }

    char singleLine[128];

    while(!feof(fp)){
        fgets(singleLine, 128, fp);
        if(singleLine[0] == 'v' && singleLine[1] == ' '){
          struct vec3d v;
          char junk[2];
            
          fscanf(fp, "%s %f %f %f", &junk, &v.x, &v.y, &v.z);
          printf("read from file: %s, %f, %f, %f\n", junk, v.x, v.y, v.z);
          verts[lastVertIndex].x = v.x;
          verts[lastVertIndex].y = v.y;
          verts[lastVertIndex].z = v.z;
          lastVertIndex++;
        }

        if(singleLine[0] == 'f' && singleLine[1] == ' '){
          int f[3];
          char junk[2];
          fscanf(fp, "%s %f %f %f", &junk, &f[0], &f[1], &f[3]);
          tris[lastTriIndex].p1 = verts[f[0] - 1];
          tris[lastTriIndex].p2 = verts[f[1] - 1];
          tris[lastTriIndex].p3 = verts[f[2] - 1];
          lastTriIndex++;
        }
    };
    fclose(fp);
    return 0;
}```
#包括
#包括
#包括
/*主向量函数*/
结构向量3D{
浮动x;
浮动y;
浮动z;
};
/*三矢量三角形结构*/
结构三角形{
结构向量3d-p1;
结构向量3d-p2;
结构向量3d-p3;
};
/*函数加载对象文件*/
int main(){
结构向量3D顶点[256];
结构三角形三角形三角形[256];
int lastVertIndex=0;
int lastTriIndex=0;
文件*fp;
fp=fopen(“cube.obj”,“r”);
如果(fp==NULL){
perror(“打开文件时出错。\n”);
退出(退出失败);
}
字符单线[128];
而(!feof(fp)){
FGET(单线,128,fp);
if(单线[0]='v'&&singleLine[1]=''){
结构向量;
煤焦垃圾[2];
fscanf(fp、%s%f%f“、&trank、&v.x、&v.y、&v.z);
printf(“从文件读取:%s,%f,%f,%f\n”,垃圾,v.x,v.y,v.z);
顶点[lastVertIndex].x=v.x;
顶点[lastVertIndex].y=v.y;
顶点[lastVertIndex].z=v.z;
lastVertIndex++;
}
如果(单线[0]='f'&&单线[1]=''){
int f[3];
煤焦垃圾[2];
fscanf(fp、%s%f%f“、&trank、&f[0]、&f[1]、&f[3]);
tris[lastTriIndex].p1=verts[f[0]-1];
tris[lastTriIndex].p2=顶点[f[1]-1];
tris[lastTriIndex].p3=顶点[f[2]-1];
lastTriIndex++;
}
};
fclose(fp);
返回0;
}```

仅仅说“.obj文件”并不能告诉我们文件中有什么内容。事实上,obj文件通常是Windows二进制文件,但您似乎将其解析为文本文件(因此我假设它实际上不是二进制obj文件)。因此,请明确说明文件中的内容、预期输出以及实际输出。我假设您的“obj”文件实际上是一个3D对象坐标文件,而不是一个编译文件。无论如何,我相信你每隔一行处理一行的原因是你用
fgets
读取一行(该行进入
singleLine
),然后你用
fscanf
从文件中读取另一行。您可能希望执行
sscanf(单线,…)
而不是
fscanf(fp,…)
。(否则,您需要提供要处理的OBJ文件的示例。)@DaveM。你的解决方案奏效了!非常感谢你。关于格式,我已经更新了问题,以更准确地描述我希望发生的事情,而不是输出的内容。