Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich nutze in meinem C-Programm die Funktion ctime um das aktuelle Datum und die Uhrzeit zu erfassen. Wenn ich diese in einem String speichere befindet sich am Ende "\n".

    Beispiel: Wed Jun 30 21:49:08 1993\n

    Dies möchte ich aus dem String entfernen. Ich hab bisher noch keine Alternative zu ctime gefunden und mit fällt auch nichts ein wie ich dieses Problem beheben kann.

    Über Lösungsvorschläge würde ich mich freuen.

    Gruß Steffen

  • Hallo Steffen,

    bei mir kommt bei

    kein \n = Carriage Return.

    Notfalls musst Du das auf genauso wundersame Weise abschneiden wie es dazu gekommen ist.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (27. Februar 2016 um 21:27)

  • Danke für die Antwort.

    Ich möchte eine Datei benennen mit "DatumUhrzeit".xls . Mit ctime erhalte ich Datum und Uhrzeit und mit strcpy verbinde ich dies mit ".xls". Hinter "DatumUhrzeit" ist allerdings im Dateinamen ein komisches Zeichen. Wenn ich den gesamten Pfad mit printf ausgeben möchte erscheint ".xls" erst nach drücken der Enter Taste.

    Auf meinem Windows rechner ist das "komische Zeichen" ausgeschrieben "%0a".

    Wie meinst du das mit abschneiden?

  • Hallo Steffen,

    Dir haut auf dem Windows-PC ein Wagenrücklauf %0a = dec. 10 und bei Linux ein Zeilenvorschub /n = $0d = dec. 13 dazwischen.

    Wo das herkommt, ist nur Deinem Code zu entnehmen.


    Wie meinst du das mit abschneiden?

    na, was nicht passt, wird passend gemacht... Schnipp-schnapp und weg ist das Byte.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Wo das herkommt, ist nur Deinem Code zu entnehmen.


    Geht auch ohne wie ich festgestellt habe. Siehe diese Seite.

    @KingOfTheRoad: Du musst einfach das letzte Zeichen im ctime String welches ein \n ist löschen oder einfach Dein ".xls" ein Zeichen früher anhängen und dabei das \n überschreiben.

  • Hallo Steffen,

    im Eingabefenster den Lichtbalken auf die Stelle bringen, in der \n steht, und mittels Entf- oder Backspace-Taste \n ausradieren.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <wiringPi.h>
    #include <wiringPiI2C.h>
    #include <pthread.h>
    #include <time.h>
    #include <sys/types.h>
    #include <sys/wait.h>

    #define MPU 0x68
    #define WAKE_UP 0
    #define ACCEL_XOUT_H 0x3B
    #define ACCEL_XOUT_L 0x3C
    #define ACCEL_YOUT_H 0x3D
    #define ACCEL_YOUT_L 0x3E
    #define ACCEL_ZOUT_H 0x3f
    #define ACCEL_ZOUT_L 0x40
    #define TEMP_OUT_H 0x41
    #define TEMP_OUT_L 0x42
    #define PWR_MGMT_1 0x6B

    int Messung=0;
    char Anfangszeiteins[100]="", Anfangszeitzwei[100]="", Endzeit[100]="", Zeit[100]="" ;
    char Pfad[100]="Messdaten/", Pfad_Speicher[100]="/var/www/Messdaten/";

    void Start(){
    char x;
    scanf("%c",&x);
    Messung=1;
    }

    char *Uhrzeit(){
    time_t now;
    now = time(0);
    char *Neu_Zeit;
    Neu_Zeit=ctime(&now);
        
    return Neu_Zeit;
    }

    char * stringReplace(char*, char*, char*);

    void *Stop(void* ch);

    void *Indexhtml(void* ph);

    int read_byte(int fd, char adr) {
    return wiringPiI2CReadReg8(fd, adr);
    }

    int read_word(int fd, char adr){
    int word = read_byte(fd, adr)<<8|read_byte(fd, adr+1);
        
    if (word>= 0x8000){
    word = -(0xFFFF - word + 1);
    }
    return word;
    }

    int main() {
    int fd = wiringPiI2CSetup(MPU);
        
    if(fd == -1) {
    return 0;
    }
        
    int AcX, AcY, AcZ;
    double dAcX, dAcY, dAcZ;
    float result, param;
    int i=0;
    char Endung[]=".xls", Pfad_Auswertung[100]="";
    FILE *Auswertung;
    pthread_t Stopp, Index;
        
    printf("Druecken Sie eine Taste um die Messung zu Starten\n");
        
    Anfang: while(Messung==0){
    Start();
    }
        
    printf("Messung gestartet\n");
        
    pthread_create(&Stopp,NULL,&Stop,NULL);
        
    Neue_Datei: strcpy(Zeit,Uhrzeit());
        
    if(strcmp(Anfangszeiteins,"") ==0){
    strcpy(Anfangszeiteins,Zeit);
    }
    else{
    strcpy(Anfangszeitzwei,Zeit);
    }
    strcat(Zeit, Endung);
    strcpy(Pfad_Auswertung, Pfad_Speicher);
    strcat(Pfad_Auswertung,Zeit);
    for(i=0; i<6; i++){
    stringReplace(" ", "_", Pfad_Auswertung);
    }
    for(i=0; i<2; i++){
    stringReplace(":", "_", Pfad_Auswertung);
    }
    i=0;
        
    Auswertung = fopen(Pfad_Auswertung,"w");
        
    wiringPiI2CWriteReg16(fd, PWR_MGMT_1, WAKE_UP);
        
    fprintf(Auswertung,"\n");
        
    while(Messung==1) {
    AcX = read_word(fd, ACCEL_XOUT_H);
    AcY = read_word(fd, ACCEL_YOUT_H);
    AcZ = read_word(fd, ACCEL_ZOUT_H);
            
    dAcX = (AcX-255)/16384.0;
    dAcY = (AcY+286)/16384.0;
    dAcZ = (AcZ+705)/16384.0;
            
    param = pow(dAcX,2)+pow(dAcY,2)+pow(dAcZ,2);
    result = sqrt(param);
            
    fprintf(Auswertung,"\t\t\t%.f\n",result*1000);
            
    i++;
            
    if(i==100){
    fclose(Auswertung);
    strcpy(Endzeit,Uhrzeit());
    pthread_create(&Index,NULL,Indexhtml,NULL);
    i=0;
    delay(100);
    goto Neue_Datei;
    }
                
            
    delay(100);
            
    }
    fclose(Auswertung);
    strcpy(Endzeit,Uhrzeit());
    pthread_create(&Index,NULL,Indexhtml,NULL);
    i=0;
        
    printf("Messung beendet");
        
    goto Anfang;
        
    return 0;
    }

    void *Stop(void* dummy){
    char x;
    scanf("%c",&x);
    Messung=0;
    pthread_exit(0);
    }

    void *Indexhtml(void* dummy){
    FILE *Index;
    char Dateipfad[100]="", Anfang[100]="", Zeit_Start[100]="", Datei_Ende[500000]="", cha[1];
    int in, i;
    strcpy(Zeit_Start,Zeit);
        
    Index = fopen("/var/www/Beschleunigungssensor.html","rb+");
        
    strcpy(Dateipfad,Pfad);
    strcat(Dateipfad,Zeit_Start);
        
    if(strcmp(Anfangszeiteins,"") !=0){
    strcpy(Anfang,Anfangszeiteins);
    strcpy(Anfangszeiteins,"");
    }
    else{
    strcpy(Anfang,Anfangszeitzwei);
    strcpy(Anfangszeitzwei,"");
    }
        
    fseek(Index,938L,SEEK_SET);
        
    while( (in=fgetc(Index)) !=EOF ){
    sprintf(cha, "%c", in);
    strcat(Datei_Ende,cha);
    }
        
    fseek(Index,938L,SEEK_SET);
        
    for(i=0; i<4; i++){
    stringReplace(" ", "_", Dateipfad);
    }
    for(i=0; i<2; i++){
    stringReplace(":", "_", Dateipfad);
    }
        
    fprintf(Index,"<tr>\n<td>%s</td>\n<td>%s</td>\n<td><a href=\"%s\"\n type=\"application/msexcel\">\nDownload\n</a></td>\n</tr>\n",Anfang, Endzeit, Dateipfad);
    fprintf(Index,"%s",Datei_Ende);
        
    fclose(Index);
        
    pthread_exit(0);
    }

    char * stringReplace(char *search, char *replace, char *string) {
    char *tempString, *searchStart;
    int len=0;


    // preuefe ob Such-String vorhanden ist
    searchStart = strstr(string, search);
    if(searchStart == NULL) {
    return string;
    }

    // Speicher reservieren
    tempString = (char*) malloc(strlen(string) * sizeof(char));
    if(tempString == NULL) {
    return NULL;
    }

    // temporaere Kopie anlegen
    strcpy(tempString, string);

    // ersten Abschnitt in String setzen
    len = searchStart - string;
    string[len] = '\0';

    // zweiten Abschnitt anhaengen
    strcat(string, replace);

    // dritten Abschnitt anhaengen
    len += strlen(search);
    strcat(string, (char*)tempString+len);

    // Speicher freigeben
    free(tempString);
        
    return string;
    }

    Ich entschuldige mich für die fehlende Beschriftung

  • Na also :thumbs1:

    Ersetze mal

    Code
    strcat(Zeit, Endung);

    durch

    Code
    Zeit[strlen(Zeit)-1]=0;
    strcat(Zeit, Endung);

    Was passiert da?

    In C müssen alle Strings mit 0 beendet werden. Mit der eingefügten Zeile schreibst Du an die Stelle, wo das \n steht eine 0. D.h. Du kürzt damit den Zeit String um ein Byte und löschst damit natürlich auch das \n. ;)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!