Программа чтения файлов C пропускает все остальные строки

#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. Ваше решение сработало! Большое вам спасибо. Что касается форматирования, я обновил вопрос, чтобы более точно описать, что я хочу, чтобы произошло, в сравнении с тем, что было на выходе.