Toon posts:

[Java] File-renaming deployen als executable *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Naar aanleiding van een project voor de Lokerse Feesten (zie ook een ander topic) moest ik een fotoboek-programma (lees bat-bestand met dos-opdrachten in) aanpassen zodat het gebruik zou maken van MySQL.
Op zich was dit geen probleem, maar ik wou er meteen ook de kleine foutjes uithalen.

Wat mijn programma deed was:
1. Eerst een userinput vragen over welke groep de foto's gaan.
2. Foto's resizen
3. Foto's renamen zodat ze de vorm "groep"xxx.jpg krijgen
...

Het moeilijkste was deftig renamen. "ren" is te primitief om dit te doen en alle andere batch-renaming software ondersteund geen command line renaming (wat ik nodig heb om in mijn bat-bestand te zetten).

Ik ging dus zelf aan de slag...in JAVA :D
Dit is mijn code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.*;

public class Rename {

    public static void main(String args[]) {
    int a = 1000;
    File directory =
        new File(System.getProperty("user.dir"));
    String[] textFileNames =
        directory.list(new FilenameFilter() {
            public boolean accept(File dir, String name) {
            return name.endsWith(".jpg");
            }
        });

    System.out.println("Beginnig file-renaming: " + textFileNames.length + " files to rename.\n");

    for (int i = 0; i < textFileNames.length; ++i) {
        System.out.print("Renaming file "+(i+1)+" of " + textFileNames.length + ".\r");
        File oldFile =
        new File(textFileNames[i]);
        String b = (a+i+1)+"";
        File newFile =
        new File(args[0] + b.substring(1,b.length()) + textFileNames[i].substring(textFileNames[i].length() - 4));
        oldFile.renameTo(newFile);
    }
    
    System.out.println("\n\nRenaming finished succesfully.");
    }
}


Deze code werkt volledig zoals ik wil en geeft mij alle vrijheid. Perfect dus...of toch niet :?

Het probleem is dat ik hiervoor dus JAVA moet draaien op de pc in kwestie; Dat zou in principe niet zo een probleem zijn, ware het niet dat het programma de ene dag op PC 1 moet draaien en een uur later op PC 5 zonder problemen...en het probleem is dat op de Lokerse Feesten geen enkele pc standaard JAVA mee heeft.

Ik wil dus iets makkelijkers. En hiervoor dacht ik, waarom maak ik er nou niet gewoon een simpele .exe-file van. Met JAVA gaat dit niet echt heb ik al begrepen uit de search, dus dan maar C of C++. Hiervan heb ik wel al een basiskennis ondertussen, maar werken met files heb ik nog nooit gedaan.

Mijn vraag, is het doenbaar als je nog nooit met files gewerkt hebt in C of C++ om dit programma te vertalen naar C of C++? En kunnen jullie mij misschien enkele hulpvolle links geven zodat ik daaruit zelf wat kan gaan prutsen om het in orde te krijgen?

PS: sorry voor het verpesten van de layout, als het echt stoort pas ik het aan maar zo blijft de code leesbaar hé

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 01-02 20:46

dawuss

gadgeteer

Uit http://www.cplusplus.com/ref/cstdio/rename.html :

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
/* rename example */
#include <stdio.h>

int main ()
{
  int result;
  char oldname[] ="oldname.txt";
  char newname[] ="newname.txt";
  result= rename( oldname , newname );
  if (result != 0 )
    perror( "Error renaming file" );
  return 0;
}


En dit heb ik gewoon met Google gevonden. De eerste treffer :)

[ Voor 8% gewijzigd door dawuss op 03-04-2004 20:13 ]

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 10:14

Eelke Spaak

- Vlad -

Waarom lever je niet gewoon een JRE bij het programma? Zo doen de meeste ontwikkelaars dat als ze een Java-programma willen deployen.

TheStreme - Share anything with anyone


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Hum Vladimir maakt het nog interessant, we kijken nog even :)

[ Voor 94% gewijzigd door curry684 op 03-04-2004 20:17 ]

Professionele website nodig?


Verwijderd

Topicstarter
Vladimir G. schreef op 03 april 2004 @ 20:13:
Waarom lever je niet gewoon een JRE bij het programma? Zo doen de meeste ontwikkelaars dat als ze een Java-programma willen deployen.
Omdat je dan ook JRE erbij moet leveren. Dat wil zeggen, volledig installeren, soms zelf path goed zetten etc.
Vaak is het zo dat ze foto's online moeten zetten, ergens een pc gaan uitzoeken en dan moet het zo snel mogelijk werken. Sinds dat photoshop daar ver op elke pc staat is dat niet zo een probleem, maar java vind je daar amper. Je kan verstaan dat ik dan ook liever niet JRE ga installeren op elke pc om 1 keer het programma op te draaien.

Verwijderd

Topicstarter
dawuss schreef op 03 april 2004 @ 20:13:
Uit http://www.cplusplus.com/ref/cstdio/rename.html :

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
/* rename example */
#include <stdio.h>

int main ()
{
  int result;
  char oldname[] ="oldname.txt";
  char newname[] ="newname.txt";
  result= rename( oldname , newname );
  if (result != 0 )
    perror( "Error renaming file" );
  return 0;
}


En dit heb ik gewoon met Google gevonden. De eerste treffer :)
Die code doet het inderdaad wel goed, alleen omdat ik de kennis van files ontbreek kan ik het niet aanpassen dat hij alle files uit een directory gaat zoeken, vandaar dus de vraag naar links met meer uitleg. Maar alleszins bedankt, het is een stap in de goeie richting.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Zoek eens naar opendir (tenminste, ik dacht dat die functie zo heet).

opendir(char *__dirname);
readdir(DIR *__dir);
closedir(DIR *__dir);
rewinddir(DIR *__dir);

Die DIR* krijg je vanuit opendir terug.

zit in dirent.h

[ Voor 54% gewijzigd door Robtimus op 03-04-2004 20:47 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
IceManX schreef op 03 april 2004 @ 20:42:
Zoek eens naar opendir (tenminste, ik dacht dat die functie zo heet).

opendir(char *__dirname);
readdir(DIR *__dir);
closedir(DIR *__dir);
rewinddir(DIR *__dir);

Die DIR* krijg je vanuit opendir terug.

zit in dirent.h
Daar wou ik dus wat op gaan zoeken, blijkt dat voor een of andere reden in mijn Visual Studio geen dirent.h zit en ik die dus niet kan gebruiken :(

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

En die functies zitten niet in een andere header? Zo nee, dan is het een brak pakket.
Zowel onder Linux (glibc-headers) als onder Windows 2000 (Borland C++ Compiler) heb ik die gewoon.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Damoke:
Omdat je dan ook JRE erbij moet leveren. Dat wil zeggen, volledig installeren, soms zelf path goed zetten etc.
Vaak is het zo dat ze foto's online moeten zetten, ergens een pc gaan uitzoeken en dan moet het zo snel mogelijk werken. Sinds dat photoshop daar ver op elke pc staat is dat niet zo een probleem, maar java vind je daar amper. Je kan verstaan dat ik dan ook liever niet JRE ga installeren op elke pc om 1 keer het programma op te draaien.
Kijk eens naar Java Web Start (zie sig). Wordt nog veel te weinig gebruikt voor deploying van Java applicaties imho. En 't zit toch echt kinderlijk eenvoudig in elkaar :) Als je een jnlp file op een fileserver kan zetten (of desnoods ergens online) ben je praktisch klaar. Kijk in de JWS documentatie ook even naar het checken of Java Web Start is geinstalleerd (met javascript).

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

je kunt ook proberen je stukje code te compilen naar native java code, met gcj of exselsior (laatste kost je een grote zak geld)....

http://gcc.gnu.org/java/

http://www.excelsior-usa.com/

[ Voor 19% gewijzigd door Verwijderd op 04-04-2004 10:19 . Reden: links ]


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 10:14

Eelke Spaak

- Vlad -

drm schreef op 03 april 2004 @ 21:46:
[...]
Kijk eens naar Java Web Start (zie sig). Wordt nog veel te weinig gebruikt voor deploying van Java applicaties imho. En 't zit toch echt kinderlijk eenvoudig in elkaar :) Als je een jnlp file op een fileserver kan zetten (of desnoods ergens online) ben je praktisch klaar. Kijk in de JWS documentatie ook even naar het checken of Java Web Start is geinstalleerd (met javascript).
Als een user een Java Web Start applicatie wil draaien moet er toch ook een JRE zijn geïnstalleerd? Daar zit 'm dus juist het probleem; de TS wil geen JRE installeren.

TheStreme - Share anything with anyone


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Verwijderd schreef op 03 april 2004 @ 21:17:
[...]

Daar wou ik dus wat op gaan zoeken, blijkt dat voor een of andere reden in mijn Visual Studio geen dirent.h zit en ik die dus niet kan gebruiken :(
Is geen ISO C of ISO C++, dus daarom.
Alternatief:
Boost::Filesystem
Kijk bijvoorbeeld naar het 'find_file' voorbeeld, halverwege de pagina.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
OK, ik heb het probleem anders aangepakt. Ik maak eerst een txt-bestand met daarin alle jpeg's die renamed moeten worden. Die lees ik dan in en slaag elke regel op in een string (array eigenlijk).

Daarna wil ik elk element uit de array met rename laten hernoemen, maar ik stoot op een probleem. Dit is mijn code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* fscanf example */
#include <stdio.h>

main (int argc, char *argv[])
{
  char temp [80];
  int i=0;
  int regels = 0;
  char str[1000] [80];
  int result;
  char oldname[] ="oldname.txt";
  char newname[] ="newname.txt";
  FILE * pFile;

  pFile = fopen ("fotos.txt","r+");
  rewind (pFile);

  while(fscanf (pFile, "%s", temp) != EOF)
      regels++;

  rewind (pFile);

  printf("Het aantal regels: %d\n", regels);

  for (i = 0; i < regels; i++){
   fscanf (pFile, "%s", str[i]);
  }

  fclose (pFile);
  for (i = 0; i < regels; i++){
   printf ("I have read: %s \n",str[i]);
  }

  if (argc == 2){
      printf("You have entered %d arguments\n",argc);
      printf("Your second argument was %s",argv[1]);
  }
  else{
      printf("You have entered a wrong number of arguments");
  }

  result= rename( oldname , newname );
  if (result != 0 )
    perror( "Error renaming file" );

  return 0;
}


Er staan veel printf's in, maar dat is gewoon ter controle dat alles goed opgeslagen is. Jammer genoeg stopt het programma blijkbaar na de 'else'. Het renamen gebeurt gewoon niet. Als ik de rename-opdracht bovenaan mijn code zet dan krijg ik zelf niets meer van output. Er zit dus duidelijk een probleem ergens in het rename-stuk maar ik weet niet wat. Zolang ik dit niet heb kan ik de rename natuurlijk ook niet aanpassen om heel de array te renamen.

Een andere vraag. Zoals je kan zien heb ik de array moeten beperken tot 1000. Dit is vaak te veel, en een array van lengte "regels" (-> het aantal regels in mijn txt) zou voldoende zijn. Blijkbaar mag ik dit toch niet doen. Ik heb geprobeerd om de array pas te definieren na het bepalen van het aantal regels maar dan krijg ik allemaal compile-errors. Is hier een reden voor, of zie ik iets over het hoofd? Als het niet lukt om pas later te declareren vind ik dat niet erg maar ik vind het verspilling van een vaste array te definieren die plaats heeft voor 1000 strings. In JAVA bestaat er zoiets als een arraylist, bestaat dat ook in C(++) :?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

In C moet je nu eenmaal alles in het begin van een blok declareren, daar ontkom je niet aan. Hooguit zou je een nieuw blok kunnen beginnen ( { } ), alleen dat is wel de scope van je vars.

C++ heeft zowel een list als vector (#include <list>, #include <vector>), die zouden het beiden gewoon moeten doen voor jou. list is zeg maar de LinkedList, vector de ArrayList/Vector.
Ik denk dat C++ voor jou sowieso de beste keuze is omdat die gewoon zoveel meer op Java lijkt (plus je kan C gebruiken; andersom niet).

[ Voor 12% gewijzigd door Robtimus op 04-04-2004 14:07 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
OK, bleek dat het een stomme fout was, ergens in dat zelfde project had ik een file rename genoemd en hij "overschreef" dus het commando rename. Renamen doet het nu zoals het moet op 1 detail na.

Ik probeer dit:

C++:
1
rename ( str[i], printf("GROEP%d",i) );


In een loop te steken, maar dat werkt dus niet. Ik krijg een error dat hij in parameter 2 int niet kan converteren naar char. Ja dan probeer ik gewoon te casten door char(...) te doen (weet niet of dit de correcte syntax is :?) maar dan zegt hij dat het geen const char is wat nodig is voor rename. Hoe ik het ook draai of keer, die tweede parameter krijg ik niet goed opgevuld. Iemand hints aub?

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

drm schreef op 03 april 2004 @ 21:46:
[...]
Kijk eens naar Java Web Start (zie sig). Wordt nog veel te weinig gebruikt voor deploying van Java applicaties imho. En 't zit toch echt kinderlijk eenvoudig in elkaar :) Als je een jnlp file op een fileserver kan zetten (of desnoods ergens online) ben je praktisch klaar. Kijk in de JWS documentatie ook even naar het checken of Java Web Start is geinstalleerd (met javascript).
Ik vind die WebStart wel handig, maar als je iets meer wilt dan gewoon applet functionaliteit, dus sockets openen, files lezen of schrijven, dan moet je gelijk alles weer signen enzo en dat vind ik niet erg simpel en makkelijk eigenlijk.

"Beauty is the ultimate defence against complexity." David Gelernter


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Verwijderd schreef op 04 april 2004 @ 14:17:
OK, bleek dat het een stomme fout was, ergens in dat zelfde project had ik een file rename genoemd en hij "overschreef" dus het commando rename. Renamen doet het nu zoals het moet op 1 detail na.

Ik probeer dit:

C++:
1
rename ( str[i], printf("GROEP%d",i) );


In een loop te steken, maar dat werkt dus niet. Ik krijg een error dat hij in parameter 2 int niet kan converteren naar char. Ja dan probeer ik gewoon te casten door char(...) te doen (weet niet of dit de correcte syntax is :?) maar dan zegt hij dat het geen const char is wat nodig is voor rename. Hoe ik het ook draai of keer, die tweede parameter krijg ik niet goed opgevuld. Iemand hints aub?
Dat gaat niet werken, want printf levert geen string (char*) terug.
Probeer eens dit:
C++:
1
2
sprintf(new_str, "GROEP%d", i); // stopt "GROEP<i>" in new_str
rename(str[i], new_str);
Waarbij new_str dus een char[] is, groot genoeg om al je groepen in op te slaan.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
OK dat deed het, thx ;)

Nog een "schoonheidsvraagje":

Is het mogelijk om zoals in mijn JAVA-programma steeds 3 decimalen af te drukken.

Ik probeerde het met %3d maar dan krijg je gewoon spaties. Ik zou liefst hebben dat ipv "GROEP 1.jpg" er staat "GROEP001.jpg". Als het zo gedaan wordt klopt de chronologische rangschikking namelijk nog achteraf in het fotoboek en bij "GROEP 1.jpg" zou dat wel een anders kunnen zijn.

(excuus voor deze (voor jullie waarschijnlijk simpele) vragen)

Als laatse wil ik iedereen hier eens hartelijk bedanken. Dankzij jullie heb ik nu toch mijn eerste "bruikbaar" (-> "Hello World" vind ik niet bruikbaar) programma. Thx everyone :).

Edit: Als jullie willen post ik hier zometeen de uiteindelijke code, weet niet of het handig is voor mensen?

[ Voor 14% gewijzigd door Verwijderd op 04-04-2004 15:14 . Reden: typo ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

GROEP%03d moet het hem doen. Die 0 zorgt voor 0-filling.

(je zou trouwens niet zeggen dat ik vrijwel geen C/C++ ervaring heb he? ;) Wat Kernighan en Ritchie wel niet voor elkaar kunnen krijgen :D)

[ Voor 57% gewijzigd door Robtimus op 04-04-2004 15:17 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Thx, alles is nu 100% zoals ik het wou.

Ik lig hier naast mij dus toevallig ook met "C handboek - Brian Kernighan & Dennis M. Ritchie". Wegens tijdsgebrek nooti al te ver in geraakt (en die eerste hoofdstukken trekken zo hard op de structuur in JAVA dat ik nooit genoeg moed had om ver te raken in dat boek, maar ik ga toch nog eens proberen nu).

Hierbij het programma voor wie het later nog zou zoeken.

Wat het dus net doet:
Alle bestanden beschreven in "fotos.txt" worden hernoemd naar "GROEPNAAMxxx.jpg".
Voorwaarden: "fotos.txt", "Rename.exe" en alle foto's uit "fotos.txt" moeten in dezelfde map staan.
Syntax: Rename.exe GROEPNAAM

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* Renaming-programma in opdracht van de Lokerse Feesten */
/* Met dank aan: GoT */

#include <stdio.h>

int main (int argc, char *argv[])
{
    /*Declaratie van de variabelen */
    char temp [80];
    int i=0;
    int regels = 0;
    char str[1000] [80];
    int result;
    char new_str [80];
    FILE * pFile;
    
    /*Declaratie pFile. Hier staat het bestand dat gelezen wordt.*/
    pFile = fopen ("fotos.txt","r");
    
    /*Rewind zorgt ervoor dat het lezen op de eerste regel begint.*/
    rewind (pFile);
    
    /*We bepalen het aantal regels in de file.*/
    while(fscanf (pFile, "%s", temp) != EOF)
        regels++;

    /*Nu spoelen we de file terug voor het inlezen.*/
    rewind (pFile);

    /*We gaan elke regel af en slagen hem op in een string.*/
    for (i = 0; i < regels; i++){
        fscanf (pFile, "%s", str[i]);
    }
    
    /*We hebben alles uit de file, dus we sluiten de file.*/
    fclose (pFile);
    
    /*We hernoemen elke string naar de goeie vorm.*/
    for (i = 0; i < regels; i++){
        sprintf(new_str, "%s%03d.jpg", argv[1], i);
        result = rename( str[i], new_str);
        if (result != 0 )
            perror( "Error renaming file" );
    }
    
    return 0;
}


Nogmaals dank voor alle hulp! _/-\o_

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Wat opmerkingen:

1) je checkt niet op de grootte van argv (if (argc < 2) // error )
2) je controleert na regel 18 niet of het openen wel lukt.
3) waarom de input niet als argv[1]? Dus Rename.exe <INPUTFILE> <GROEPNAAM>

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
IceManX schreef op 04 april 2004 @ 15:37:
Wat opmerkingen:

1) je checkt niet op de grootte van argv (if (argc < 2) // error )
2) je controleert na regel 18 niet of het openen wel lukt.
3) waarom de input niet als argv[1]? Dus Rename.exe <INPUTFILE> <GROEPNAAM>
Je hebt gelijk, om een volwaardig programma te zijn zou het nog aangepast moeten worden. Het is echter een programma dat in een bat-bestand komt dat ik zelf zal maken. Daardoor ben ik zeker dat fotos.txt het bestand zal zijn en dat er altijd het goeie aantal argumenten opgegeven zal worden.

Verwijderd

Topicstarter
OK gisteren was het dus vergadering en nu moeten er nog een paar aanpassingen aan gedaan worden. Het grootste deel kan ik zelf oplossen maar wat ik niet weet is of het makkelijk mogelijk is van externe programma's aan te roepen in je programma en te wachten tot die uitgevoerd zijn.

(praktisch: ik wil plink.exe een mysqlimport laten uitvoeren en nadien het programma verder laten lopen. Ik kan natuurlijk gewoon 2 programma's maken en alles na elkaar in een bat steken maar voor alleen die plink zou ik het mooier vinden als ik dat rechtstreeks uit mijn programma kan aanroepen)

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Onder Linux heb je fork() en de exec familie (dit keer niet Kernighan & Ritchie, maar "Advanced Linux Programming" ;)).
Ik weet alleen niet of er iets soortgelijks is voor Windows.

je kan ook de "system" functie gebruiken, die zit in stdlib.h. Onder Linux wacht die totdat het is afgelopen, onder Windows vast ook. Deze is alleen wel minder net en minder secure (opent een nieuwe shell).

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
IceManX schreef op 06 april 2004 @ 11:32:
Onder Linux heb je fork() en de exec familie (dit keer niet Kernighan & Ritchie, maar "Advanced Linux Programming" ;)).
Ik weet alleen niet of er iets soortgelijks is voor Windows.

je kan ook de "system" functie gebruiken, die zit in stdlib.h. Onder Linux wacht die totdat het is afgelopen, onder Windows vast ook. Deze is alleen wel minder net en minder secure (opent een nieuwe shell).
Wow thx, net ff in Kernighan & Ritchie opgezocht en system doet alles wat ik wil volgens mij. Die nieuwe shell is niet zo'n probleem want die wordt dan (denk ik) toch direct afgesloten als hij gedaan heeft en een mysqlimport van een 20-tal regels zal wel niet zo lang duren, kans is groot dat ze het niet eens zien. Bedankt!

Verwijderd

Topicstarter
Onverwacht op een raar probleem gestoten:

Ik probeer deze code:
C++:
1
2
3
4
    for (i = 0 ; i < regels ; ++i ) {
        if ( group[i] == argv[1] )
            ++resultaat;
    }

maar ook al zijn ze voor het oog gelijk, het resultaat krijgt nooit waarde 1 ipv 0. De enige keer dat dit lukt is als ik group[i] met group[i] vergelijk, dan past de waarde wel aan...

Ik weet dat er in JAVA speciale dingen zijn om strings te controleren op gelijkheid etc, maar kan niet meteen iets vinden (ik versta ook niet waarom de vergelijking group[i] == group[i] het wel doet eigenlijk).

Hulp? (system doet het trouwens uitstekend)

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
strcmp uit string.h als ik mij het goed herinner.

dus strcmp(str1, str2) en geeft als uitvoer <0 indien str1 < str2, >0 als str1 > str2 en 0 als strings gelijk zijn.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
En op je andere vraag:

Je bent bezig om de waarde van twee geheugenlocaties met elkaar te vergelijken. Deze zijn in het eerste geval ongelijk, omdat het twee verschillende string instanties vertegenwoordigen.

In het tweede geval vergelijk je de pointer met zichzelf en dat is natuurlijk wel het geval.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

bigbeng heeft volledig gelijk.

Je moet er alleen even aan wennen dat in Java equals true teruggeeft als ze gelijk zijn, in C(++) geeft strcmp 0 en dus false terug.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
OK zeer genant maar dit krijg ik dus OOK niet in orde :D, ik hoop dat jullie het niet te erg vinden.

Dit is wat ik wil doen. Je geeft een naam in en C slaat die op in een char-array. Nadien bepaal je hoeveel tekens effectief opgevuld zijn in die array (dus tellen tot aan '\n') en daarna definieer je een nieuwe array met net die lengte. (Dit is nodig want anders kan ik de twee strings niet vergelijken :'( )

Ik gebruik deze code:
C:
1
2
3
4
5
6
7
8
9
10
    char groepsnaam[100];
    char c;
    int i = 0;

    while( ( c = getchar() ) != '\n' ){
        groepsnaam[i] = c;
        ++i;
    }
    
    char temp[i];


Als ik dat wil compileren krijg ik "error C2143: syntax error : missag ';' before 'type' "

Dit probleem heb ik hiervoor ook al gehad maar dan kon ik het anders oplossen, nu gaat dat niet.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Gebruik std::string in plaats van char[] ! Dat is veel makkelijker. Zo kun je dan gewoon zegen:
C++:
1
2
std::string str[1000]; //volgorde maakt niet meer uit
en str[i] == argv[i] // want std::string heeft wel een operator==

Als je het nog meer C++ gebruikt dan kun je met met std::copy je file rechtstreeks naar een std::vector<std::string> kopieren, wat je nu nog 20 regels kost. Is ff zoeken in P&W, maar wel hier te vinden.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op 06 april 2004 @ 18:05:
Gebruik std::string in plaats van char[] ! Dat is veel makkelijker. Zo kun je dan gewoon zegen:
C++:
1
2
std::string str[1000]; //volgorde maakt niet meer uit
en str[i] == argv[i] // want std::string heeft wel een operator==

Als je het nog meer C++ gebruikt dan kun je met met std::copy je file rechtstreeks naar een std::vector<std::string> kopieren, wat je nu nog 20 regels kost. Is ff zoeken in P&W, maar wel hier te vinden.
Het probleem is dat je daar ook een vaste waarde geeft. Nu blijkt mijn probleem groter dan ik dacht.

Wat ik dacht:
Ik heb een array voor 1000 voorzien maar vul die nooit volledig op. De rest wordt dan met junk opgevuld en dan is twee strings vergelijken niet mogelijk.

Nu blijkt:
Zelf als ik een string tijdelijk waarde 7 geef en ik geef ook een naam met 7 tekens in staat er nog altijd junk achter...ik heb geen idee hoe dit komt.

Verwijderd

Topicstarter
OK mijn probleem is opgelost. Door
C:
1
char groepsnaam[] = {""}

was mijn probleem opgelost.

Mijn prof informatica had wel al eens gezegd dat JAVA veel voor jou doet en daar dacht ik nu aan en besefte dat de array dus standaard vol junk stond, door dit is het opgelost en werkt het wel zoals het moet. Hartelijk dank toch voor de mensen die me hebben willen helpen.

Verwijderd

Topicstarter
OK laatste vervelend vraagje en nadien is mijn programma volledig klaar denk ik.

Ik moet system op een bepaald moment gebruiken om een SQL-query uit te voeren. Normaal is dat geen probleem maar dit keer wel.

Normaal definieer ik eerst een char-array, en daarna doe ik daar system op. Dat werkt mooi.

Nu moet ik echter in mijn char-array een variabele kunnen zetten (de groepsnaam) zodat mijn SQL-query kan filteren op die variabele.

Ik heb al geprobeerd op gewoon %s te gebruiken en dan na de string de variabele te zetten (printf-wise) maar dat wou niet veel helpen.

Kan iemand mij nog dat één keertje op weg helpen :?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

sprintf werkt niet??
C:
1
sprintf(dest, "bladiebla %s bladiebla", group_name);

[ Voor 9% gewijzigd door Robtimus op 06-04-2004 22:29 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
IceManX schreef op 06 april 2004 @ 22:29:
sprintf werkt niet??
C:
1
sprintf(dest, "bladiebla %s bladiebla", group_name);
Het werkt wel maar niet volledig. Voor die SQL-query moet ik uiteindelijk GROEPSNAAM% krijgen, het is de % die ik er niet achter krijg, C blijft het maar als spatie omzetten (en de search kan ik jammer genoeg niet gebruiken omdat die nog steeds offline is bij mij toch)

  • Marcj
  • Registratie: November 2000
  • Laatst online: 12:35
Verwijderd schreef op 06 april 2004 @ 22:42:
[...]

Het werkt wel maar niet volledig. Voor die SQL-query moet ik uiteindelijk GROEPSNAAM% krijgen, het is de % die ik er niet achter krijg, C blijft het maar als spatie omzetten (en de search kan ik jammer genoeg niet gebruiken omdat die nog steeds offline is bij mij toch)
die % wordt gebruikt om vanalles te parsen. Wil je een % erin hebben moet je %% tikken (dus twee achter elkaar)
Pagina: 1