2010-12-19 10 views
1

Предположим, у меня есть файл SomFoo.txt, который содержит строку некоторой длины. Есть ли способы прочитать содержимое файла без использования iostream ie (fread или fgets). Я знаю размер файла.C - Прочтите файл без использования iostream

+1

http://en.wikibooks.org/wiki/C_Programming/File_IO – khachik

+0

fgetc/fgets/fread/read - это функции для чтения файла! read использует файловые дескрипторы, другие funcs используют указатели файлов. Вы говорите, что хотите использовать файловые дескрипторы вместо указателей файлов? Может быть, если вы объясните лучше - вы можете получить лучший ответ. Также укажите ОС. – Abhi

+2

C не имеет 'iostream'. Я думаю, вам нужно редактировать свои теги. –

ответ

3

Вы говорите о C++ (где есть заголовок <iostream>) или о С, где вы, вероятно, говорить о потоках файлов, ака FILE *, как найти в <stdio.h> (или, в C++, в <cstdio>)?

В любом случае, в Unix и связанных с ним системах существует множество системных вызовов с использованием дескрипторов файлов, которые являются более низкими, чем функции потоков. Ключ, основные из которых являются:

  • открыт
  • близко
  • чтения
  • записи
  • lseek

Там также большой бросок других для специальных операций (розетки, трубы , асинхронный ввод-вывод, сброс/сбор ввода-вывода, позиционирование ввода-вывода и т. д.).

1

Вы можете использовать встроенный код сборки внутри кода C.

+0

Это предполагает, конечно, Windows. –

+0

Да, различия в Linux упоминаются в ссылке. Но это та же основная идея. – pcantin

+0

INT 21 - это древний 16-разрядный API DOS. Сегодня я не буду считать эту портативную версию; не удалили ли они всю поддержку DOS в 64-разрядных версиях Windows? – Porculus

1

Вы можете использовать память с отображением io с mmap. Ниже приведен пример чтения файла/и т.д./фетровую-релиз и напечатать его содержание:

#include <sys/mman.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#define handle_error(_label, _text) do { perror(_text); goto _label; } while (0) 

int main(int argc, char *argv[]) 
{ 
    char *addr; 
    int fd; 
    struct stat sb; 
    size_t length; 
    ssize_t s; 

    fd = open("/etc/fedora-release", O_RDONLY); 
    if (fd == -1) { 
     handle_error(exit_failure, "open"); 
    } 

    if (fstat(fd, &sb) == -1) { 
     handle_error(exit_failure, "fstat"); 
    } 
    length = sb.st_size; 

    addr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0); 
    if (addr == MAP_FAILED) { 
     handle_error(exit_failure, "mmap"); 
    } 

    s = write(STDOUT_FILENO, addr, length); 
    if (s != length) { 
     if (s == -1) { 
      handle_error(exit_failure, "write"); 
     } 

     fprintf(stderr, "partial write"); 
     goto exit_failure; 
    } 

    exit(EXIT_SUCCESS); 

exit_failure: 
    exit(EXIT_FAILURE); 
} 
1

отпускает простое решение:

int File_read(char *filename, char *buffer){ 
    FILE *fp = fopen(filename, "rb"); //open the file 
    if (fp == NULL){ 
     return 0; //indicate that the file does not exist 
    } 
    int length = 0; 
    while ((current = fgetc(fp)) != EOF){ //get one char (note return value is an int) 
     buffer[length] = current; //store the current char 
     length = length + 1; //increase length 
    } 
    fclose(fp); //close the file 
    return length; //no more chars, return length 
} 
Смежные вопросы