Как прочитать содержимое файла в строке в C?

Каков самый простой способ (наименее подверженный ошибкам, наименьшие строки кода, однако вы хотите его интерпретировать), чтобы открыть файл на C и прочитать его содержимое в строку (char *, char [], что угодно)?

Я стараюсь просто загружать весь буфер в виде необработанного fragmentа памяти в память и самостоятельно выполнять синтаксический анализ. Таким образом, я лучше всего контролирую то, что стандартный lib делает на нескольких платформах.

Это заглушка, которую я использую для этого. вы также можете проверить коды ошибок для fseek, ftell и fread. (для ясности опущено).

 char * buffer = 0; long length; FILE * f = fopen (filename, "rb"); if (f) { fseek (f, 0, SEEK_END); length = ftell (f); fseek (f, 0, SEEK_SET); buffer = malloc (length); if (buffer) { fread (buffer, 1, length, f); } fclose (f); } if (buffer) { // start to process your data / extract strings here... } 

Другое, к сожалению, сильно зависящее от ОС решение – это сопоставление памяти с файлом. Преимущества, как правило, include в себя производительность чтения и уменьшение использования памяти, так как кэш файлов приложений и операционных систем может фактически использовать физическую память.

Код POSIX будет выглядеть так:

 int fd = open("filename", O_RDONLY); int len = lseek(fd, 0, SEEK_END); void *data = mmap(0, len, PROT_READ, MAP_PRIVATE, fd, 0); 

Windows с другой стороны немного сложнее, и, к сожалению, у меня нет компилятора для меня, чтобы проверить, но функциональность предоставляется CreateFileMapping() и MapViewOfFile() .

Если «прочитать его содержимое в строке» означает, что файл не содержит символов с кодом 0, вы также можете использовать функцию getdelim (), которая либо принимает блок памяти, либо перераспределяет его, если это необходимо, либо просто выделяет весь буфер для вы и читаете файл в нем до тех пор, пока он не встретит указанный разделитель или конец файла. Просто передайте ‘\ 0’ в качестве разделителя, чтобы прочитать весь файл.

Эта функция доступна в библиотеке GNU C, http://www.gnu.org/software/libc/manual/html_mono/libc.html#index-getdelim-994

Пример кода может выглядеть так просто, как

 char* buffer = NULL; size_t len; ssize_t bytes_read = getdelim( &buffer, &len, '\0', fp); if ( bytes_read != -1) { /* Success, now the entire file is in the buffer */ 

Если файл является текстовым, и вы хотите получить текст за строкой, самый простой способ – использовать fgets ().

 char buffer[100]; FILE *fp = fopen("filename", "r"); // do not use "rb" while (fgets(buffer, sizeof(buffer), fp)) { ... do something } fclose(fp); 

Если вы читаете специальные файлы, такие как stdin или pipe, вы не сможете использовать fstat для получения размера файла заранее. Кроме того, если вы читаете двоичный файл, fgets собирается потерять информацию о размере строки из-за встроенных символов «\ 0». Лучшим способом чтения файла является использование read и realloc:

 #include  #include  #include  #include  int main () { char buf[4096]; ssize_t n; char *str = NULL; size_t len = 0; while (n = read(STDIN_FILENO, buf, sizeof buf)) { if (n < 0) { if (errno == EAGAIN) continue; perror("read"); break; } str = realloc(str, len + n + 1); memcpy(str + len, buf, n); len += n; str[len] = '\0'; } printf("%.*s\n", len, str); return 0; } 

Если вы используете glib , вы можете использовать g_file_get_contents ;

 gchar *contents; GError *err = NULL; g_file_get_contents ("foo.txt", &contents, NULL, &err); g_assert ((contents == NULL && err != NULL) || (contents != NULL && err == NULL)); if (err != NULL) { // Report error to user, and free error g_assert (contents == NULL); fprintf (stderr, "Unable to read file: %s\n", err->message); g_error_free (err); } else { // Use file contents g_assert (contents != NULL); } } 
 // Assumes the file exists and will seg. fault otherwise. const GLchar *load_shader_source(char *filename) { FILE *file = fopen(filename, "r"); // open fseek(file, 0L, SEEK_END); // find the end size_t size = ftell(file); // get the size in bytes GLchar *shaderSource = calloc(1, size); // allocate enough bytes rewind(file); // go back to file beginning fread(shaderSource, size, sizeof(char), file); // read each char into ourblock fclose(file); // close the stream return shaderSource; } 

Это довольно грубое решение, потому что ничего не проверено на значение null.

Только что измененный из принятого ответа выше.

 #include  #include  #include  char *readFile(char *filename) { FILE *f = fopen(filename, "rt"); assert(f); fseek(f, 0, SEEK_END); long length = ftell(f); fseek(f, 0, SEEK_SET); char *buffer = (char *) malloc(length + 1); buffer[length] = '\0'; fread(buffer, 1, length, f); fclose(f); return buffer; } int main() { char *content = readFile("../hello.txt"); printf("%s", content); } , #include  #include  #include  char *readFile(char *filename) { FILE *f = fopen(filename, "rt"); assert(f); fseek(f, 0, SEEK_END); long length = ftell(f); fseek(f, 0, SEEK_SET); char *buffer = (char *) malloc(length + 1); buffer[length] = '\0'; fread(buffer, 1, length, f); fclose(f); return buffer; } int main() { char *content = readFile("../hello.txt"); printf("%s", content); } 
  • log4j перенаправить stdout на DailyRollingFileAppender
  • Добавление элементов в xml-файл в C #
  • Пакет: удаление расширения файла
  • открыть файл в эксклюзивном режиме в C #
  • Поиск файлов в папке с помощью Java
  • Можно проверить размер и тип ввода = файл в html5
  • Как переместить / переименовать файл из внутреннего хранилища приложений во внешнее хранилище на Android?
  • Открытый файл PDF для Android
  • Создание pdf-файла в android программно и запись в него
  • Как написать значение одного свойства объекта?
  • Определение типа двоичного / текстового файла в Java?
  • Давайте будем гением компьютера.