Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kommandozeilen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.11.2008, 19:01 Uhr
~aaaaaaaaaaa
Gast


Hallo,

bin gerade dabei ein Programm zu schreiben aber so richtig komme ich nicht weiter und es sind noch eingie Unklarheiten.


C++:
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int opt;
    FILE *datei;
    char line [100];
    char *info;
    char gll []={"$GPGLL"};
    //char rmc []={"$GPRMC"};

    while ((opt=getopt(argc, argv, "c:stfh")) != -1)
    {
        switch (opt)
        {
        case 'c':
        {
            if (optarg[0] == 1)
                printf("g");
            else if (optarg[0] == 2)
                printf("f");
            else if (optarg[0] == 3)
                printf("e");
            else
                printf("False Function\n");
        }
        break;

        case ':':
            fprintf(stderr, "missing value.\n");
            break;

        case '?':
            fprintf(stderr, "Option is unkown\n");
            break;

        }

        datei = fopen("gpslog.txt","r");

        if (datei != NULL)
        {

            while ((fgets(line,100,datei)) != NULL)
                {
                    if (strncmp(line,gll,6) == 0)
                    {
                        info=strtok(line, ",");
                        fputs (info+3, datei);
                    }
                }
        }
        else
            printf ("Can't open or find datei");

        fclose(datei);

    }
    return 0;
}



1) Bei getopt ist "c:stf:h" eine Zeichenkette. Wenn ich jetzt programm.exe -c 1 -s -t -f datei.txt eingebe, wie kann er das in "int opt" speichern. Wäre das nicht ein String mit char[]

2) In allen Einführungs-Beispielen habe ich gesehen dass es so steht

printf ("Die eingabe war %c", optarg); => optarg = 1

Bei Kollegen habe ich gesehen dass es mit optarg[0] steht. Habe mich bisschen gespielt und es funktioniert nur auf diese Weise.

if(optarg[0] == 1)
Funktion 1();

if (optarg[0] == 2)
Funktion 2();


3) Was bedeutet optopt und optind

4)Als ich versucht habe das Programm zu testen und das File zu öffnen, stand "Cant find or open datei". Wieso kommt es nicht in die Text-Datei.

Weiter konnte ich es noch nicht testen. Sind bisschen viele Fragen aber ich hoffe ihr könnt mir helfen.

Ich bin bereit etwas zu lesen aber bitte nicht in Englisch

MfG

PS. Wieso steht bei mir immer beim ersten mal Falscher Sicherheitscode und löscht den Inhalt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.11.2008, 21:56 Uhr
0xdeadbeef
Gott
(Operator)


1. getopt gibt das Optionszeichen zurück, für -c also 'c'. Das geschieht in einem int, um ggf. für wchar_t etc. gerüstet zu sein - zumindest war das meines Wissens die ursprüngliche Idee, viel ist da im Endeffekt nicht draus geworden.

2. optarg ist ein char*, dementsprechend muss das

C++:
printf("Die Eingabe war %s\n", optarg);


sein. Für -f datei.txt wäre optarg also "datei.txt" (und getopt gäbe 'f' zurück).

3. Wenn eine unbekannte Option übergeben wird - also der Optionsstring zum Beispiel wie oben "c:stfh" wäre (das müsste übrigens, wenn -f ein Argument erwartet, "c:stf:h" sein) und der Benutzer beim Aufruf etwa -w angibt, gäbe getopt dafür '?' zurück und speicherte das Zeichen in optopt. Wenn dagegen ein Optionsargument fehlt, in diesem Fall also z.B. -c ohne Argument angegeben wird, gibt getopt ':' zurück und setzt optopt auf das Optionszeichen, in diesem Fall 'c'.

optind beinhaltet den Index des nächsten abzuarbeitenden Elements in argv. getopt wird typischerweise immer mit den selben Argumenten aufgerufen, irgendwo muss er sich merken, wie weit er ist - in optind.

4. Dass du "gpslog.txt" nicht öffnen konntest, lag im Zweifel entweder daran, dass sie nicht existierte, oder dass du keine Leserechte darauf hattest.

Ansonsten steht sowas alles in der Manpage, siehe z.B. http://manpages.ubuntu.com/manpages/dapper/de/man3/getopt.html
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.11.2008 um 21:57 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.11.2008, 22:47 Uhr
~aaaaaaaaaaa
Gast


Hallo

ich danke dir für deine Hilfe. Endlich eine Antwort.

1) Wenn ich jetzt -c 1 -s -t -f datei.txt eingebe. Kann er die ganzen zeichen in einen int speichern. Ich hätte gedacht dass da in array gehört.

Danke für den Fehler und das wchar_t kenne ich nicht also lasse ich es auch weg.

2)Da ist mir noch unklar


C++:
printf("Die Eingabe war %s\n", optarg);
Es funktioniert so aber nicht so


C++:
if (optarg == 1)
                printf("g");


sondern nur so


C++:
if (optarg[0] == '1')
                printf("g");


Wo ist da jetzt der Unterschied?

4)Ich habe es geprüft. Die Datei existiert im selben Ordner und ich habe auch die vollen Rechte.
Am Anfang bin ich reingekommen und als ich das Programm erweitert habe, hatte ich plötzlich keinen Zugriff mehr.

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.11.2008, 12:55 Uhr
~aaaaaaaaa
Gast



C++:
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int opt;
    FILE *datei;

    char c;


    while ((opt=getopt(argc, argv, "c:stf:h")) != -1)
    {
        switch (opt)
        {
        case 'c':
        {
            if (optarg[0] == '1')
                printf("g");
            else if (optarg[0] == '2')
                printf("f");
            else if (optarg[0] == '3')
                printf("e");
            else
                printf("False Function\n");
        }
        break;

        case ':':
            fprintf(stderr, "missing value.\n");
            break;

        case '?':
            fprintf(stderr, "Option is unkown\n");
            break;

        }

        datei = fopen("gpslog.txt","r");

        if (datei != NULL)
        {

            while ((c=fgetc(datei)) != EOF)
            {
            
                    fputc (c,datei);
        
            }
        }
            else
            {
                printf ("Can't open or find datei");
            }
            fclose(datei);

        }
        return 0;
    }


Ich habe jetzt die text-Datei in den selben Ordner wie die exe-Datei gestellt. Es zeigt mir nicht mehr "Can't open or find datei" an, aber diesmal zeigt es mir garnichts an. Es holt nicht den Text aus der Datei.

[cpp] while ((c=fgetc(datei)) != EOF)
while ((fgets(line, 100, datei) != NULL)[\cpp]

Wieso muss ich bei einem EOF und beim anderen NULL schreiben. Hat das fast nicht dieselbe funktion.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.11.2008, 15:08 Uhr
0xdeadbeef
Gott
(Operator)


Das Zeichen '1' hat ja auch einen anderen ASCII-Wert als 1. (49, wenn mich nicht alles täuscht) Wenn du das ganze als Zahl vergleichen willst,

C++:
int wert;

/* ... */

if(sscanf(optarg, "%d", &wert) == 1) {
  switch(wert) {
  case 1: {
      zeug();
      break;
    }
  case 2: {
      mehr_zeug();
      break;
    }
  case 3: {
      noch_mehr_zeug();
      break:
    }
  default: {
      andernfalls_anderes_zeug();
    }
  }
}



Die Datei muss in dem Verzeichnis liegen, aus dem du das Programm aufrufst (Arbeitsverzeichnis). Dass er in diesem Fall nichts macht, wird daran liegen, dass

C++:
datei = fopen("gpslog.txt","r");


die Datei zum Lesen öffnet und

C++:
fputc (c,datei);


dementsprechend nicht in die Datei schreiben kann.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.11.2008, 15:56 Uhr
~aaaaaaaaa
Gast


Diese Fehler habe ich geschafft zu beheben.Aber hänge wieder an einer Stelle



C++:
char line [100];
char gll []="$GPGLL";
char abc []="$GPGLL";

while ((fgets(line, 100, datei)) != NULL)
            {
                if (strncmp(line,gll,6) == 0)
                {
                    info=strtok(line, ",");

                 }
             }


Gebe ich if
C++:
(strncmp(abc,gll,6) == 0)
ein, komme ich ins Unterprogramm.

Aber wenn ich
C++:
(strncmp(line,gll,6) == 0)
eingebe, überspringt er das Unterprogramm.

Ich will dass es die ersten 6 Zeichen von gll und von jeder Zeile meiner Datei vergleicht.
Irgendwo tritt da wieder ein Fehler auf.

Danke für deine Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.11.2008, 16:37 Uhr
0xdeadbeef
Gott
(Operator)


fgets holt sich die erste Zeile, samt newline-Zeichen. Mit

C++:
char gll[] = "$GPGLL\n";

// ...

if(strcmp(line, gll) == 0)


müsste es gehen. strncmp ist übrigens eher dann sinnvoll, wenn du nur die ersten paar Zeichen zweier Strings vergleichen willst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.11.2008, 17:57 Uhr
~aaaaaaaaa
Gast


Das will ich auch.

Ich habe

$GPGLL,aaaa,bbbbbbbb,ccccc,ddddddd
$xxxxx,alsdfj,asdfa,adsf,dasf,asdf
$GPGLL,aaaa,bbbbbbbb,ccccc,ddddddd

Ich brauche jetzt immer aus meiner Datei die c-Werte von der $GPGLL-Zeile (das sind 6 Zeichen)

Ich habe es geschafft dass es mir immer die c-Werte anzeigt. Es filtert aber noch nicht die $GPGLL Zeilen aus der Datei
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.11.2008, 18:09 Uhr
0xdeadbeef
Gott
(Operator)


Tja, so aus der Entfernung kann ich das auch nicht debuggen. Lass es im Debugger laufen und kuck, was dir fgets in line schreibt - in irgendeiner Form unterscheidet sich das scheinbar von dem, was du brauchst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: