kann man aus array=[10 20 11 11 30 40 ....] ein array=[1020 1111 3040 ...] machen?



  • Ich denke, so sollte es gehen:

    #include <fstream>
    #include <vector>
    
    int main() {
      std::vector<int> v;
      std::ifstream in("datei.txt");
      char c;
      int i;
    
      do {
        i = 0;
        if(in.get(c)) {
          i |= int(c) << 8;
          if(in.get(c)
            i |= int(c);
          v.push_back(i);
        }
      } while(in);
    }
    


  • Wenn Du sie als ints einliest, dann kannste zwei so zusammenkleben:

    unsigned int erg = 256*a + b;
    


  • super idee danke

    thx for help



  • oohh



  • Ne andere möglichkeit ohne bitshifting:

    #include <fstream>
    #include <vector>
    
    int main(){
      std::vector<int> data;
      std::ifstream file("file.dat",std::ios::binary);
    
      file.seekg(0,std::ios::end);
      unsigned filesize = file.tellg();
      file.seekg(0,std::ios::beg);
    
      unsigned loop_cnt = filesize / 2;
    
      for(unsigned i = 0; i < loop_cnt; ++i)
      {
         int temp = 0;
         file.read( reinterpret_cast<char*>(&temp) , 2 );
         data.push_back(temp);
      }
    
      if(filesize % 2)
      {
        int temp = 0;
        temp = file.get();
        data.push_back(temp);
      }   
    }
    

    😃



  • Bei evilissimos Lösung kriegst du aber arge Probleme auf big endian-Maschinen.



  • Nach dem ich mir den Text von rico_del_sol noch mal durchgelesen hab ist mir aufgefallen das die byteorder der wave datei wohl auch anzupassen ist.
    Das hab ich bei dem code da oben nicht beachtet, dazu kommt, das ich auch die endianess (Edit: des aktuellen systems )nicht beachtet hab, also ist der alte post n gutes beispiel für eine falsche version 🙂

    MfG



  • okay,

    nun ist es soweit das nächste für mich unlösbare problem ist da.
    beim angefügte listing geht alles, bis in der wave datei ein eintrag mit "... 1A ...." auftaucht.
    Jedesmal wenn im file die zahl 0x1A vorkommt schreibt das programm nur noch 0xff und zwar ab da nur 0xff in die outputdatei, anstatt auch 0x1A zu schreiben.

    Ziel war es erst einmal eine wav-datei stück für stück zu kopieren,
    aus wav2dsp.wav in die datei dsp_filtered.wav.
    wie gesagt wenn der wert 1A im wave auftaucht schmiert das proggi ab????
    ich hab 1A mit 00 ersetzt und alles funktioniert wunderbar ?? was ist hier los bitte um hilfe.

    ///////////////////////////////////////////////////////////////////////////////

    FILE * fp_in;
    FILE * fp_out;

    short sample;
    short header_stuff;
    int right_high, left_high;
    int right_low, left_low;
    unsigned int right_hex, left_hex;
    int right[16];
    int left[16];
    int i, j, k;
    long size_of_data = 4;

    //MAIN/////////////////////////////////////////////////////////////////////////////////////////
    fp_in = fopen ("wav2dsp.wav","r");
    fp_out= fopen ("dsp_filtered_wav.wav","w");

    if (fp_in==NULL || fp_out==NULL)
    {(perror ("Error opening file\n"));}
    else
    {
    //this reads out the size of the sound data
    fseek (fp_in, 0, SEEK_END);
    size_of_data = ftell( fp_in );

    //this copies the header from the input-wav.file to output-wav.file
    fseek (fp_in, 0, SEEK_SET);
    fseek (fp_out, 0, SEEK_SET);
    cout<<"\nHeader of the Wavefile :\n"<< endl;
    for (j=0; j <size_of_data+1 ; j++)
    {
    header_stuff = fgetc( fp_in );
    if (header_stuff == 1A) (header_stuff= 1A)
    putc(header_stuff ,fp_out);
    }
    }

    return 0;



  • Bitte Code-Tags verwenden

    [cpp]
    if (header_stuff == 0x1A) (header_stuff= 0x1A)
    putc(header_stuff ,fp_out);
    }
    [/cpp]

    Wie sieht es hiermit aus?

    EDIT: Bzw, was hat es eigentlich mit dem Konstrukt hinter dem if auf sich 😕
    Ist das so gemeint?

    for (j=0; j <size_of_data+1 ; j++) { 
        header_stuff = fgetc( fp_in ); 
    
        if (header_stuff == 0x1A) {
            header_stuff= 0x1A;
        }
    
        putc(header_stuff ,fp_out); 
    }
    


  • habs im netz gefunden.

    also fopen denkt es würde die datei im text mode öfnen man muss explizit
    fopen (... "rb") für binary benutzten dann geht alles ohne probl.

    das komische konstrukt nach dem if hab ich aus versehen noch nicht gelöscht gehabt es stammte ncoh von einem versuch das ganze zu umgehen.

    thx for ur help



  • OK,

    if (header_stuff == 0x1A) { 
            header_stuff= 0x1A; 
        }
    

    ...hätte ja auch nicht viel Sinn gemacht 😉


Anmelden zum Antworten