Один из хороших способов получить данные из файла - это fscanf (). Нет необходимости использовать fgets или sscanf. Вы можете использовать while(fgetc(fp) != '\n');
для следующей строки.
fscanf используется как sscanf, но для файла. другие правила такие же.
пожалуйста, проверьте код, который я его переписываю.
#include <stdio.h>
#include <stdlib.h>
int LINE_LENGTH = 100;
int parseInput(FILE* fp, FILE* output) {
char* line = calloc(LINE_LENGTH, sizeof(char));
int camFlag, lightFlag, frames;
if (fscanf(fp, "%d %d %d", &frames, &camFlag, &lightFlag) != 3) return 1;
printf("frames - %d, camFlag - %d, lightFlag - %d\n", frames, camFlag, lightFlag);
while(fgetc(fp) != '\n');
if (camFlag) {
double cx, cy, cz, dx, dy, dz, dt;
if (fscanf(fp, "%lf %lf %lf %lf %lf %lf %lf", &cx, &cy, &cz, &dx, &dy, &dz, &dt) != 7) return 1;
printf("cx - %lf, cy - %lf, cz - %lf, dx - %lf, dy - %lf, dz - %lf, dt - %lf\n", cx, cy, cz, dx, dy, dz, dt);
while(fgetc(fp) != '\n');
// do stuff with input
}
if (lightFlag) {
double cx, cy, cz;
unsigned char r, g, b;
if (fscanf(fp, "%lf %lf %lf %hhu %hhu %hhu", &cx, &cy, &cz, &r, &g, &b) != 6) return 1;
printf("cx - %lf, cy - %lf, cz - %lf, r - %hhu, g - %hhu, b - %hhu\n",cx, cy, cz, r, g, b);
while(fgetc(fp) != '\n');
// do stuff with this data
}
for (int i = 0; i < frames; i++) {
int n;
if (fscanf(fp, "%d", &n) != 1) return 1;
printf("n - %d\n", n);
while(fgetc(fp) != '\n');
// etc...
}
}
int main(int argc, char ** argv)
{
FILE * fp1 = NULL , * fp2 = NULL;
fp1 = fopen(argv[1], "r");
fp2 = fopen(argv[2], "w");
parseInput(fp1, fp2);
}
file data:
1 2 3
1.1 2.2 3.3 4.4 5.5 6.6 7.7
1.1 2.2 3.3 4 5 6
1
OUTUPT:
frames - 1, camFlag - 2, lightFlag - 3
cx - 1.100000, cy - 2.200000, cz - 3.300000, dx - 4.400000, dy - 5.500000, dz - 6.600000, dt - 7.700000
cx - 1.100000, cy - 2.200000, cz - 3.300000, r - 4, g - 5, b - 6
n - 1