C - прочитать файл без использования iostream - PullRequest
1 голос
/ 19 декабря 2010

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

Ответы [ 4 ]

3 голосов
/ 19 декабря 2010

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

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

  • открыт
  • близко
  • прочитать
  • запись
  • lseek

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

1 голос
/ 19 декабря 2010

давайте перейдем к простому решению:

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
}
1 голос
/ 19 декабря 2010

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

#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 голос
/ 19 декабря 2010

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

...