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

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

81
задан Ciro Santilli 新疆改造中心法轮功六四事件 16 June 2018 в 21:39
поделиться

4 ответа

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

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

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...
}
127
ответ дан Nils Pipenbrinck 24 November 2019 в 09:34
поделиться

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

код 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().

24
ответ дан Morgoth 24 November 2019 в 09:34
поделиться

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

char buffer[100];
FILE *fp = fopen("filename", "r");                 // do not use "rb"
while (fgets(buffer, sizeof(buffer), fp)) {
... do something
}
fclose(fp);
6
ответ дан selwyn 24 November 2019 в 09:34
поделиться

Если "считанный его содержание в строку" означает, что файл не содержит символы с кодом 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 */
11
ответ дан David Nathan 24 November 2019 в 09:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: