2015-02-21 4 views
1
#include <stdio.h> 
#include <stdlib.h> 

int count_arr(FILE *file) 
{ 
int c,count=0; 
//FILE *file; 
//file = fopen("test.txt", "r"); 
if (file) { 
    while ((c = getc(file)) != EOF){ 
     putchar(c); 
     ++count;} 
    fclose(file); 
} 
return count; 
} 

void make_arr (FILE *file, char arr[]){ 
    int c,n=0,count=0; 
    char ch; 
//FILE *file; 
//file = fopen("test.txt", "r"); 
if (file) { 
    while ((c = getc(file)) != EOF){ 
    ch = (char)c; 
    arr[n]=ch; 
    ++n; } 
    fclose(file); 
} 

} 


int main(){ 
FILE *file; 
int n; 
//scanf("%c",&file_name); 
file = fopen("test.txt","r"); 

int count = count_arr(file); 
char arr [count]; 

make_arr(file, arr); 

for(n=0; n<count;++n) printf("%c",arr[n]); 

} 

Пока это все, что у меня есть для моего кода. Я знаю, что делаю это совершенно неправильно. Когда я печатаю массив символов, он печатает случайный мусор ... Я пытаюсь закодировать функцию «make_arr», которая передает массив, который хранится с символами из файла. Любая помощь будет оценена!Как создать массив символов из файла?

+0

Вы можете получить размер файла 'fseek (файл, 0, SEEK_END); int size = ftell (файл); fseek (файл, 0, SEEK_SET); 'затем выделить память и прочитать весь файл' char * arr = malloc (size); fread (arr, размер, 1, файл); '. Не забудьте закрыть файл и освободить свой буфер. – Cyclonecode

+0

код открыл файл в main(), поэтому он должен быть закрыт в main() не в обеих вспомогательных функциях. main() может легко перемотать файл так, чтобы make_arr() мог прочитать его снова, используя функцию функции fseek (файл, 0, SEEK_SET) сразу после вызова count_arr() – user3629249

+0

с использованием fseek (файл, 0, SEEK_END); ftell (файл) даст количество байтов в файле в двух строках кода и будет значительно быстрее, чем чтение байта файла байтом. то функция count_arr() может быть устранена. – user3629249

ответ

2

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

FILE* file = fopen("file.txt", "r"); 
// get filesize 
fseek(file, 0, SEEK_END); 
int fsize = ftell(file); 
fseek(file, 0, SEEK_SET); 
// allocate buffer **note** that if you like 
// to use the buffer as a c-string then you must also 
// allocate space for the terminating null character 
char* buffer = malloc(fsize); 
// read the file into buffer 
fread(buffer, fsize, 1, file); 
// close the file 
fclose(file); 

// output data here 
for(int i = 0; i < fsize; i++) { 
    printf("%c", buffer[i]); 
} 

// free your buffer 
free(buffer); 

Если вы действительно хотите использовать функцию, чтобы заполнить буфер это будет работать (на самом деле не вижу смысла, хотя), хотя Я все еще буду делать операцию только один для чтения:

void make_array(FILE* file, char* array, int size) { 
    // read entire file into array 
    fread(array, size, 1, file); 
} 

int main(int argc,char** argv) { 
    // open file and get file size by first 
    // moving the filepointer to the end of the file 
    // and then using ftell() to tell its position ie the filesize 
    // then move the filepointer back to the beginning of the file 
    FILE* file = fopen("test.txt", "r"); 
    fseek(file, 0, SEEK_END); 
    int fs = ftell(file); 
    fseek(file, 0, SEEK_SET); 
    char array[fs]; 
    // fill array with content from file 
    make_array(file, array, fs); 
    // close file handle 
    fclose(file); 

    // output contents of array 
    for(int i = 0; i < fs; i++) { 
    printf("%c\n", array[i]); 
    } 
    return 0; 
} 

как я уже говорил в комментариях выше необходимо добавить пространство для завершающего нулевого символа, если вы хотите использовать массив символов в строке:

char* array = malloc(fs + 1); 
fread(array, fs, 1, file); 
// add terminating null character 
array[fs] = '\0'; 
// print the string 
printf("%s\n", array); 
+0

Как я могу использовать это для хранения файла в массиве? – LearningCODE

+0

@ user3539833 - ** Оба ** примера хранят файл в массиве символов. – Cyclonecode

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