Tady máš na rychlo zbastlený kód v C, který načte textový soubor "data.txt" v tom Tvém formátu
body do pole bodů, čáry do pole čar, trojúhelníky do pole trojúhelníků, čtyřúhelníku do pole čtyřúhelníku
a na zkoušku ty věci vypíše do "test.txt"
Funguje to obecně, můžeš si to libovolně vybagrovat a upravit jak potřebuješ
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
const int VERTEX_MAX = 4; // Maximalni pocet vertexu v radku
// Preskoci mezery a tabulatory
void SkipWhite(FILE* file)
{
int c;
do {
c = getc(file);
} while (c == ' ' || c == '\t');
if (c != EOF) {
ungetc(c, file);
}
}
// Nacte jedno cislo
int ReadNumber(FILE* file)
{
int c;
char buf[64];
int i = 0;
while ((c = getc(file)) != EOF && c != '\n' && c != ' ' && c != '\t' && c != ',') {
assert(i < 63);
buf[i++] = (unsigned char) c;
}
buf[i] = '\0';
if (c != EOF) {
ungetc(c, file);
}
return atoi(buf);
}
// Nacte cisla do konce radku oddelena bilymi znaky (mezera nebo tabulator) nebo carkou, vrati pocet cisel
int ReadNumbersToLineEnd(FILE* file, int* numbers, int maxCount)
{
int c;
int count = 0;
bool pokracovat = true;
while (pokracovat) {
SkipWhite(file);
assert(count < maxCount && "V radku je vic nez povoleny pocet cisel");
numbers[count++] = ReadNumber(file);
SkipWhite(file);
c = getc(file);
if (c == ',') {
SkipWhite(file);
c = getc(file);
}
if (c == EOF || c == '\n') {
pokracovat = false;
} else {
ungetc(c, file);
}
}
return count;
}
// count[1] - pocet points
// data[1] - pole points
// count[2] - pocet lines
// data[2] - pole lines
// count[3] - pocet triangles
// data[3] - pole triangles
// count[4] - pocet quads
// data[4] - pole quads
// atd.
struct OBJECTS {
int count[VERTEX_MAX+1];
int* data[VERTEX_MAX+1];
};
bool ReadObjects(const char* fileName, OBJECTS& objects)
// Nacte objekty z textoveho souboru
{
FILE* file = fopen(fileName, "r");
if (!file) return false;
for (int i = 0; i <= VERTEX_MAX; i++) objects.count[i] = 0;
int numbers[VERTEX_MAX]; // Pro docasne ulozeni jednoho radku cisel
int c;
bool pokracovat = true;
while (pokracovat) {
SkipWhite(file);
c = getc(file);
if (c == 'v') {
const int numCoord = ReadNumbersToLineEnd(file, numbers, sizeof(numbers) / sizeof(int));
if (numCoord > 0) {
int* data = objects.data[numCoord];
if (data) {
memcpy(&(data[numCoord * objects.count[numCoord]]), numbers, numCoord * sizeof(int));
}
objects.count[numCoord]++;
}
} else if (c == ';') { // Komentar
while ((c = getc(file)) != '\n' && c != EOF) {} // Cist az do konce radku
} else if (c == EOF) {
pokracovat = false;
} else if (c == '\n') {
// Prazdny radek, nedelat nic
} else {
assert(!"Neplatny znak na zacatku radku");
}
}
fclose(file);
return true;
}
// Testovaci vypis objects
void TestPrint(OBJECTS& objects)
{
FILE* file = fopen("test.txt", "w");
assert(file);
char* name[4+1] = {"", "point", "line", "triangle", "quad"};
for (int obj = 1; obj <= 4; obj++) {
fprintf(file, "%d %ss\n", objects.count[obj], name[obj]);
for (int i = 0; i < objects.count[obj]; i++) {
fprintf(file, " %s(", name[obj]);
for (int j = 0; j < obj; j++) {
fprintf(file, "%d", objects.data[obj][obj*i+j]);
if (j < obj-1) {
putc(',', file);
putc(' ', file);
}
}
fprintf(file, ")\n");
}
}
fclose(file);
}
int main(int argc, char* argv[])
{
OBJECTS objects;
memset(&objects, 0, sizeof(objects));
// Zjisti pocet jednotlivych objektu v souboru
// Protoze objects.data[i] = NULL, nenacita data, jen spocita pocet objektu
ReadObjects("data.txt", objects);
// Alokuje misto
if (objects.count[1] > 0) objects.data[1] = new int[1 * objects.count[1]]; // Misto pro body
if (objects.count[2] > 0) objects.data[2] = new int[2 * objects.count[2]]; // Misto pro cary
if (objects.count[3] > 0) objects.data[3] = new int[3 * objects.count[3]]; // Misto pro trojuhelniky
if (objects.count[4] > 0) objects.data[4] = new int[4 * objects.count[4]]; // Misto pro ctyruhelniky
// Nacte objekty
ReadObjects("data.txt", objects);
// Na zkousku vypise objects do souboru test.txt
TestPrint(objects);
return 0;
}
Např pokud bude v souboru data.txt:
; bla bla bla - komentar
v 3
v 15 5 13 4
v 32 1 5 15
v 1 2
v 15 2 1
v 13 25 0 3
v 8, 5, 7
tak do test.txt vypíše:
1 points
point(3)
1 lines
line(1, 2)
2 triangles
triangle(15, 2, 1)
triangle(8, 5, 7)
3 quads
quad(15, 5, 13, 4)
quad(32, 1, 5, 15)
quad(13, 25, 0, 3)
Kdyžtak se ptej.