читать из файла как массив символов - PullRequest
3 голосов
/ 04 июня 2010

Я получаю из файла, и когда я читаю, он берет его построчно, и печатает его

я хочу именно то, что я хочу, чтобы массив char содержал все символы в файле и печатал его один раз,

это код, который у меня есть

if(strcmp(str[0],"@")==0)
        {
            FILE *filecomand;
            //char fname[40];
            char line[100];
            int lcount;
            ///* Read in the filename */
            //printf("Enter the name of a ascii file: ");
            //fgets(History.txt, sizeof(fname), stdin);

            /* Open the file.  If NULL is returned there was an error */
            if((filecomand = fopen(str[1], "r")) == NULL) 
            {
                    printf("Error Opening File.\n");
                    //exit(1);
            }
            lcount=0;
            int i=0;
            while( fgets(line, sizeof(line), filecomand) != NULL ) {
                /* Get each line from the infile */
                    //lcount++;
                    /* print the line number and data */
                    //printf("%s", line);  

            }

            fclose(filecomand);  /* Close the file */

Ответы [ 4 ]

3 голосов
/ 04 июня 2010

Вам необходимо определить размер файла. Получив это, вы можете выделить достаточно большой массив и прочитать его за один раз.

Существует два способа определения размера файла.

Использование fstat:

struct stat stbuffer;
if (fstat(fileno(filecommand), &stbuffer) != -1)
{
    // file size is in stbuffer.st_size;
}

С fseek и ftell:

if (fseek(fp, 0, SEEK_END) == 0)
{
    long size = ftell(fp)
    if (size != -1)
    {
        // succesfully got size
    }

    // Go back to start of file
    fseek(fp, 0, SEEK_SET);
}
2 голосов
/ 04 июня 2010

Другое решение - сопоставить весь файл с памятью, а затем обрабатывать его как массив символов.

Под окнами MapViewOfFile и под Unix mmap .

Как только вы отобразили файл (множество примеров), вы получите указатель на начало файла в памяти. Примените это к char[].

0 голосов
/ 04 июня 2010

Используйте другое открытие. т.е.

fd = open(str[1], O_RDONLY|O_BINARY) /* O_BINARY for MS */

Оператор чтения будет для буфера байтов.

count = read(fd,buf, bytecount)

Это откроет двоичный файл и прочитает файл.

0 голосов
/ 04 июня 2010

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

Я не буду публиковать код, но вот общая схема. Используйте fseek (), чтобы перейти к концу файла, ftell (), чтобы получить размер файла, и снова fseek (), чтобы переместить начало файла. Выделите буфер символов с помощью malloc (), используя найденный вами размер. Используйте fread () для чтения файла в буфер. Когда вы закончите с буфером, освободите его ().

...