2013-10-11 3 views
0

Я хочу прочитать данные файла в строке.Чтение файла как строки

Есть функция, которая считывает весь файл в массив символов? открыть файл, как это:

FILE *fp; 

for(i = 0; i < filesToRead; i++) 
{ 
    fp = fopen(name, "r"); 

    // Read into a char array. 
} 

EDIT: Так как читать "построчно" GetChar()?

+1

Нет, если вы не пишете. Вам нужно будет прочитать каждую строку файла по строке – Pankrates

+1

Конечно, файл [memmap] (http://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html), а затем вы можете получить к нему доступ в виде массива. –

+0

Как читать это по строкам? Или вы имеете в виду char by char? –

ответ

2

Вот три способа, чтобы прочитать весь файл в смежный буфер:

  1. Выяснить длины файла, затем fread() весь файл. Вы можете определить длину с помощью fseek() и ftell(), или вы можете использовать fstat() на системах POSIX. Это не будет работать на сокетах или в трубах, оно работает только с обычными файлами.

  2. Прочитайте файл в буфер, который вы динамически расширяете по мере чтения данных, используя fread(). Типичные реализации начинаются с «разумного» размера буфера и удваивают его каждый раз, когда пространство исчерпывается. Это работает с любым файлом.

  3. На POSIX используйте fstat(), чтобы получить файл, а затем mmap(), чтобы поместить весь файл в адресное пространство. Это работает только с обычными файлами.

+0

Да, я планирую использовать fstat() для выделения размера массива перед чтением. Однако на самом деле получение данных из файла является для меня загадкой. –

+0

@MikeJohn: Да, используйте 'fread()'. См. № 1 выше. –

+0

@Mike John Это _the_ способ прочитать весь файл. Файл может иметь встроенные байты '\ 0', поэтому учтите, что если вы хотите использовать« строки », которые заканчиваются' \ 0'. Также рассмотрите возможность открытия файла в двоичном формате: «rb». – chux

0

Вы можете сделать следующее:

FILE *fp; 
int currentBufferSize; 

for(i = 0; i < filesToRead; i++) 
{ 
    fp = fopen(name, "r"); 
    currentBufferSize = 0; 
    while(fp != EOF) 
    fgets(filestring[i], BUFFER_SIZE, fp); 

} 

Конечно, вы должны сделать это в более надежным способом, проверяя, если ваш буфер может содержать все данные и так далее ...

0

Вы можете использовать что-то вроде следующего: где вы читаете каждую строку, тщательно проверяйте результат и передавайте его в структуру данных по вашему выбору. Я не показал, как правильно распределять память, но вы можете malloc спереди и realloc при необходимости.

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 

#define FILE_BUFFER_SIZE 1024 

int file_read_line(FILE *fp, char *buffer) 
{ 
    // Read the line to buffer 
    if (fgets(buffer, FILE_BUFFER_SIZE, fp) == NULL) 
     return -errno; 

    // Check for End of File 
    if (feof(fp)) 
     return 0; 

    return 1; 
} 

void file_read(FILE *fp) 
{ 
    int read; 
    char buffer[FILE_BUFFER_SIZE]; 

    while (1) { 

     // Clear buffer for next line 
     buffer[0] = '\0'; 

     // Read the next line with the appropriate read function 
     read = file_read_line(fp, buffer); 

     // file_read_line() returns only negative numbers when an error ocurred 
     if (read < 0) { 
      print_fatal_error("failed to read line: %s (%u)\n", 
       strerror(errno), errno); 
      exit(EXIT_FAILURE); 
     } 

     // Pass the read line `buffer` to whatever you want 

     // End of File reached 
     if (read == 0) 
      break; 
    } 

    return; 
} 
+0

хорошо пятнистый, фиксированный – Pankrates

Смежные вопросы