Spracovanie suboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spracovanie suboru – C / C++ – Fórum – Programujte.comSpracovanie suboru – C / C++ – Fórum – Programujte.com

 

rAdo
~ Anonymní uživatel
45 příspěvků
16. 8. 2011   #1
-
0
-

Zdravím. Potreboval by som poradiť. Celí deň si s tým neviem rady.
Mám textový súbor Vyzerá napríklad takto:

v 15 5 13 4
v 32 1 5 15
v 15 2 1
v 13 25 0 3
v 8, 5, 7

A ja by som potreboval uložiť čísla do dvoch polí v jednom budú riadky z tromi číslami a v druhom zo štyrmi.
Chcel by som dostať toto:

int p1[] = {15, 5, 13, 4, 32, 1, 5, 15, 13, 25, 0, 3};
int p2[] = {15, 2, 1, 8, 5, 7};

Mohlo by to byť aj v jednom poli načítané ale tak aby som ich vedel vytriediť.

    for(i=0; i<fac_n; i++){
        if(fac_quad[i+3] == -1){
            glBegin(GL_TRIANGLES);
                glArrayElement(fac_quad[i]);
                glArrayElement(fac_quad[i+1]);
                glArrayElement(fac_quad[i+2]);
            glEnd();
            i += 3;
        }
        else{
            glBegin(GL_QUADS);
                glArrayElement(fac_quad[i]);
            glEnd();
        }
    }

Takto my to nefunguje to by som sa nečudoval ale keď zakomentujem else vetvu stačí iba príkaz glArrayElement() tak to if funguje ale keď tam je ten príkaz tak sa if podmienka nikdy nesplní.

Nahlásit jako SPAM
IP: 91.127.68.–
Pudni tvor+2
Stálý člen
16. 8. 2011   #2
-
+2
-
Zajímavé

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.

Nahlásit jako SPAM
IP: 90.180.213.–
rAdo0
Newbie
16. 8. 2011   #3
-
0
-

#2 Pudni tvor
Ďakujem ti dobrá duša. :) Idem to hneď prerobiť podla tohto. 

Nahlásit jako SPAM
IP: 95.102.115.–
Pudni tvor+2
Stálý člen
16. 8. 2011   #4
-
0
-

#3 rAdo
Jo, ale ber to jen jako takovej náčrtek,
jedna z možností, neříkám že nejlepší.
Taky dát pryč ty aserce, doplnit kontrolu chyb v souboru,
uvolnit alokovane misto atd.
Kdyby si to chtěl mít všechno v jednom poli,
taky by to tak šlo, uprava by nebyla ani nijak slozita

Ale s tím už si určitě pohraješ.

Hodně zdaru.


Nahlásit jako SPAM
IP: 90.180.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 78 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý