do While schleife

Gast #4134486
Lesenswert?

Hallo,
Mit der do While schleife lese ich eine Datei von der SD-Card in einen 
puffer(site_puffer)ein.
Dieser ist aber nur 1500 byte gross, meine Datei aber grösser.

Meine überlegung ist erstmal count_a bis 1499 in den puffer zuschreiben 
und dann zusenden, dann count_a wieder auf null setzen und weiter in den 
puffer schreiben bis mein Ende zeichen kommt.

aber irgendwie haut das mit meiner if else abfrage nicht hin.

könnte mir da einer weiterhelfen

mfg
1
static char site_puffer[1500];
2

3
            do
4
             {
5
              res = f_read(&fsrc, &by,  1, &br);       // Daten lesen
6
         //site_puffer[count_a]=by;
7
              count_a++;
8
       
9
       //ist count_a = 1499 dann erstmal die daten senden
10
       if ((count_a == 1499))
11
        {
12
               PSOCK_SEND_STR(&s->sout,site_puffer);
13
         
14
         sprintf( read_write_buffer, "count_a:%d", count_a );
15
               DrawString(0,0,read_write_buffer,&Arial_16x25,WHITE,RED);            
16
        
17
         count_a = 0;
18
        }
19
         
20
       else
21
        {
22
          site_puffer[count_a]=by;
23
        }         
24
         
25
                
26
      }
27
              while ((by != '%'));
#4134513
Lesenswert?

Dieser code veruhrsacht alptraume!

Ungetestet:
1
static char site_puffer[1500];
2
count_a=0;
3
bool run=1;
4
while(run) {
5
  res = f_read(&fsrc, &by,  1, &br);
6
  if(by=='%'||res<=0)
7
    run = 0;
8
  else
9
    site_puffer[count_a++] = by;
10
  if(count_a >= sizeof(site_puffer)-1 || !run){
11
    site_puffer[count_a] = 0;
12
    PSOCK_SEND_STR(&s->sout,site_puffer);
13
    sprintf( read_write_buffer, "count_a:%d", count_a );
14
    DrawString(0,0,read_write_buffer,&Arial_16x25,WHITE,RED);            
15
    count_a = 0;
16
  }
17
}

PS: Hier kann es noch zu einem Bufferoverflow bei read_write_buffer 
kommen...
#4136884
Lesenswert?

a) sicher stellen, dass count_a mit 0 initialisiert ist
b) die von dir auskommentierte Stelle für "site_puffer[count_a] = by;" 
war schon richtig. Du willst ja den Buffer ab Index 0 füllen.
c) ich nehme stark an, du willst auch den Rest der Datei, der nach einem 
Vielfachen von 1499 bytes gelesen wurde abschicken -> "if ((count_a == 
1499) || (by == '%'))"
d) Ein String wird in C üblicherweise mit einem Nullbyte terminiert. 
Dies fehlt bei dir.

also so sollte es gehen:
1
static char site_puffer[1500];
2

3
count_a = 0;
4

5
do
6
{
7
  res = f_read(&fsrc, &by, 1, &br);       // Daten lesen
8
  site_puffer[count_a] = by;
9
  count_a++;
10

11
  // ist count_a = 1499 oder das Ende der Datei erreicht, Daten senden
12
  if ((count_a == 1499) || (by == '%'))
13
  {
14
    site_puffer[count_a] = 0; // terminate string
15
    
16
    PSOCK_SEND_STR(&s->sout, site_puffer);
17
    
18
    sprintf(read_write_buffer, "count_a:%d", count_a);
19
    DrawString(0, 0, read_write_buffer, &Arial_16x25, WHITE,RED);            
20
    
21
    count_a = 0;
22
  }
23
} while (by != '%');
#4136898
Lesenswert?

Und so läuft es vermutlich schneller:
1
static char site_buffer[1500];
2
char * delimiter;
3

4
do
5
{
6
  res = f_read(&fsrc, site_buffer, 1499, &br);       // Daten lesen
7

8
  site_buffer[br] = 0;  // kann sein, dass das überflüssig ist
9
  
10
  delimiter = strchr(site_buffer, '%');
11
  if (delimiter)
12
  {
13
    *delimiter = 0;      // truncate at delimiter position
14
    br = delimiter - site_buffer;  // calculate length of remaining bytes in buffer
15
  }
16
  PSOCK_SEND_STR(&s->sout, site_buffer);
17
  
18
  sprintf(read_write_buffer, "bytes read: %d\n", br);
19
  DrawString(0, 0, read_write_buffer, &Arial_16x25, WHITE,RED);            
20
} while ((br == 1499) && (delimiter == NULL));
#4136907
Lesenswert?

Steht das '%' eigentlich wirklich mitten im File, oder ist das das 
letzte Zeichen im File und du nimmst das als Hilfskonstruktion, weil du 
nicht wusstest, wie man das Ende des Files erkennt?
Wenn du das gesamte File übertragen willst, wirds natürlich einfacher. 
Dann kannst du dir die Suche nach dem '%' komplett sparen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren