Lezen uit bestand met de functie read()

Ik moet een programma schrijven dat getallen in afzonderlijke regels leest. Is het mogelijk om slechts één regel van het bestand te lezen en vervolgens een intuit de buffer te lezen, enzovoort tot het einde van het bestand? Het is echt moeilijk om goede voorbeelden te vinden van het gebruik van lezen en schrijven. Mijn voorbeeld werkt een beetje, maar ik zou graag lezen totdat het '\n'char detecteert en vervolgens de buffer naar int converteren.

#include <fcntl.h> 
#include <stdio.h> 
#include <string.h>
#include <unistd.h> 
#include <iostream>
int fd[2];
void readFile(int fd) {
    unsigned char buffer[10];
    int bytes_read;
    int k=0;
    do {
        bytes_read = read(fd, buffer, 10); 
        k++;
            for(int i=0; i<10; i++) {
            printf("%c", buffer[i]);
        }
    }
    while (bytes_read != 0); 
}
int tab[50];
int main(int argc, char *argv[]) {
    if(argv[1] == NULL || argv[2] == NULL)   {
            printf("Function requires two arguments!\nGood bye...\n");
            return -1;
    }
    else {
        if (access(argv[1], F_OK) == 0) {
            fd[0] = open(argv[1], O_RDONLY);
        }
        else { 
            fd[0] = open(argv[1], O_WRONLY|O_CREAT|O_SYNC, 0700);
            const int size = 50;
                for(int i=0; i<size; i++) {
                    char buf[10];   
                    sprintf(buf, "%d\n", i+1);
                    write(fd[0], buf, strlen(buf));
                }
                close(fd[0]);
            fd[0] = open(argv[1], O_RDONLY);
            if (access(argv[2], F_OK) == 0) 
                fd[1] = open(argv[2], O_WRONLY);
            else 
                fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);
        }
    }
    if (access(argv[2], F_OK) == 0) 
        fd[1] = open(argv[2], O_WRONLY); 
    else 
        fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);
    readFile(fd[0]);
    close(fd[0]);
    close(fd[1]);
}

Herziene code:

void readFile(int fd) {
    char buffer[10];
    int bytes_read;
    int k = 0;
    do {
        char t = 0;
        bytes_read = read(fd, &t, 1); 
        buffer[k++] = t;    
        printf("%c", t);
        if(t == '\n' && t == '\0') {
            printf("%d", atoi(buffer));
            for(int i=0; i<10; i++) 
                buffer[i]='\0';
            k = 0;
        }
    }
    while (bytes_read != 0); 
}

Antwoord 1, autoriteit 100%

Lees Byte voor Byte en controleer dat elke byte tegen '\n'als dat niet het geval is, sla het dan op in buffer
als het '\n'is, voeg dan '\0'toe aan de buffer en gebruik dan atoi()

Je kunt een enkele byte op deze manier lezen

char c;
read(fd,&c,1);

Zie read()


Antwoord 2

Ik lees wat gegevens uit een bestand met behulp van read. Hier lees ik gegevens in een 2d-tekenaanwijzer, maar de methode is ook hetzelfde voor de 1d. Lees gewoon karakter voor karakter en maak je geen zorgen over de uitzonderingen omdat de voorwaarde in de while-lus de uitzonderingen afhandelt 😀

 while ( (n = read(fd, buffer,1)) > 0 )
{   
if(buffer[0] == '\n')
{
  r++;
  char**tempData=(char**)malloc(sizeof(char*)*r);
  for(int a=0;a<r;a++)
  {
    tempData[a]=(char*)malloc(sizeof(char)*BUF_SIZE);
    memset(tempData[a],0,BUF_SIZE);
  }
  for(int a=0;a<r-1;a++)
  {
    strcpy(tempData[a],data[a]);
  }
   data=tempData;
   c=0;
}
else
{
  data[r-1][c]=buffer[0];
  c++;
  buffer[1]='\0';
}
   }

Antwoord 3

fgets zou voor u werken. hier is zeer goede documentatie hierover:-
http://www.cplusplus.com/ reference/cstdio/fgets/

Als u geen fgets wilt gebruiken, zal de volgende methode voor u werken:-

int readline(FILE *f, char *buffer, size_t len)
{
   char c; 
   int i;
   memset(buffer, 0, len);
   for (i = 0; i < len; i++)
   {   
      int c = fgetc(f); 
      if (!feof(f)) 
      {   
         if (c == '\r')
            buffer[i] = 0;
         else if (c == '\n')
         {   
            buffer[i] = 0;
            return i+1;
         }   
         else
            buffer[i] = c; 
      }   
      else
      {   
         //fprintf(stderr, "read_line(): recv returned %d\n", c);
         return -1; 
      }   
   }   
   return -1; 
}

Other episodes