de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 Wit
Wit
Question

Membaca dari berkas menggunakan fungsi read()

Saya harus menulis program yang membaca angka-angka dalam baris-baris terpisah. Apakah mungkin untuk membaca hanya satu baris file dan kemudian membaca int dari buffer, dan seterusnya sampai akhir file? Sangat sulit untuk menemukan contoh-contoh yang baik dalam menggunakan baca dan tulis. Contoh saya agak bekerja tetapi saya ingin membaca sampai mendeteksi '\n' char dan kemudian mengubah buffer menjadi int.

#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]);
}

Kode yang direvisi:

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); 
}
9 2013-11-04T14:11:52+00:00 2
Jonathan Leffler
Jonathan Leffler
Pertanyaan edit 5 Mei 2017 в 11:22
Pemrograman
file
c
Solution / Answer
 Gangadhar
Gangadhar
4 November 2013 в 2:27
2013-11-04T14:27:54+00:00
Lebih
Sumber
Sunting
#22708692

Baca Byte demi Byte dan periksa setiap byte terhadap '\n' jika tidak, maka simpan ke dalam buffer jika itu adalah '\n' tambahkan '\0' ke buffer dan kemudian gunakan atoi()

Anda bisa membaca satu byte seperti ini

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

Lihat read()

 Gangadhar
Gangadhar
Jawaban edit 4 November 2013 в 2:33
15
0
 Gaurav
Gaurav
4 November 2013 в 2:21
2013-11-04T14:21:22+00:00
Lebih
Sumber
Sunting
#22708691

fgets akan bekerja untuk Anda. berikut ini adalah dokumentasi yang sangat bagus tentang hal ini :-
http://www.cplusplus.com/reference/cstdio/fgets/

Jika Anda tidak ingin menggunakan fgets, metode berikut akan bekerja untuk Anda :-

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; 
}
 Gaurav
Gaurav
Jawaban edit 4 November 2013 в 2:28
0
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Галина Утяшова
Terdaftar 20 jam yang lalu
2
Asilbek Qadamboyev
Terdaftar 3 hari yang lalu
3
Akshit Mehta
Terdaftar 6 hari yang lalu
4
me you
Terdaftar 1 minggu yang lalu
5
Никита иванов
Terdaftar 1 minggu yang lalu
ID
JA
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi