#c #file #scanf
#c #файл #scanf
Вопрос:
Моя цель — загрузить obj-файл на C, но моя проблема в том, что 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' amp;amp; singleLine[1] == ' '){
struct vec3d v;
char junk[2];
fscanf(fp, "%s %f %f %f", amp;junk, amp;v.x, amp;v.y, amp;v.z);
printf("read from file: %s, %f, %f, %fn", 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' amp;amp; singleLine[1] == ' '){
int f[3];
char junk[2];
fscanf(fp, "%s %f %f %f", amp;junk, amp;f[0], amp;f[1], amp;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;
}```
Комментарии:
1. Простое указание «.obj file» не говорит нам, что находится в файле. На самом деле, obj-файлы обычно представляют собой двоичные файлы Windows, но вы, похоже, анализируете их как текстовый файл (поэтому я предполагаю, что на самом деле это не двоичный obj-файл). Поэтому, пожалуйста, уточните, что именно находится в файле, каков ожидаемый результат и каков фактический результат.
2. Я предполагаю, что ваш файл «obj» на самом деле является файлом координат 3D-объекта, а не скомпилированным файлом. В любом случае, я считаю, что причина, по которой вы обрабатываете каждую вторую строку, заключается в том, что вы читаете строку с
fgets
помощью (строка переходит вsingleLine
), но затем вы читаете другую строку из файла сfscanf
помощью . Вы, вероятно, хотите сделатьsscanf( singleLine, ...)
вместоfscanf( fp, ...)
. (В противном случае вам необходимо предоставить пример OBJ-файла, который вы хотите обработать.)3. @DaveM. Ваше решение сработало! Большое вам спасибо. Что касается форматирования, я обновил вопрос, чтобы более точно описать, что я хочу, чтобы произошло, в сравнении с тем, что было на выходе.