Читать файл в массиве построчно - PullRequest
2 голосов
/ 13 июля 2010

Можете ли вы установить любой индекс массива в качестве начального индекса, т.е. где читать из файла?Я боялся, если буфер может быть поврежден в процессе.

#include <stdio.h>

int main()
{
    FILE *f = fopen("C:\\dummy.txt", "rt");

    char lines[30]; //large enough array depending on file size

    fpos_t index = 0;

    while(fgets(&lines[index], 10, f)) //line limit is 10 characters
    {
        fgetpos (f, &index );
    }

    fclose(f);
}

Ответы [ 3 ]

1 голос
/ 13 июля 2010

Вы можете, но так как ваш код пытается прочитать полное содержимое файла, вы можете сделать это гораздо более напрямую с помощью fread:

char lines[30];

// Will read as much of the file as can fit into lines:
fread(lines, sizeof(*lines), sizeof(lines) / sizeof(*lines), f);

Тем не менее, если вы действительно хотите читать построчно и делать это безопасно, вам следует изменить строку fgets на:

// As long as index < sizeof(lines), guaranteed not to overflow buffer
fgets(&lines[index], sizeof(lines) - index, f);
0 голосов
/ 13 июля 2010

Не так, как это нет.Существует функция с именем fseek, которая приведет вас в другое место в файле.

Ваш код будет считывать файл в другую часть буфера (вместо чтения другой части файла).

0 голосов
/ 13 июля 2010

lines[index] - индексный символ массива lines.Его адрес не является индексной строкой.

Если вы хотите перейти к определенной строке, скажем, 5, то, чтобы прочитать 5-ю строку, прочитать 4 строки и ничего не делать с ними, они читают следующую строку и что-то с ней делают.

Если вам нужно перейти к определенному байту в файле, то вы хотите использовать fseek ().

Также: будьте осторожны, чтобы количество байтов, которое вы сообщаете fgets, было прочитаноyou (10) равен размеру массива, в который вы помещаете строку (30), поэтому сейчас это не так.

Если вам нужно прочитать часть строки, начиная сопределенный символ в этой строке, вам все равно нужно прочитать всю строку, а затем просто использовать его фрагмент, начинающийся где-то, кроме начала.

Оба эти примера похожи на запрос части документа с веб-сайта или из библиотеки - они не собираются вырывать страницу для вас, вы получаете весь документ, и вам нужно перейти начто ты хочешь.

...