Samples
C lang
- readfile.c
/*
* Author, Copyright: Oleg Borodin <onborodin@gmail.com>
*/
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 128
int main(int argc, char **argv) {
// открываем файл с именем sample.txt на чтение (r - read) и сохраняем
// результат в переменной-ссылке fd (fd - file descriptor)
//
FILE* fd = fopen("sample.txt", "r");
// проверяем, удачно ли открыт файл
// если указатель на структуру-дескриптор
// равен НИЧЕГО, то выводим на терминал сообщение
// и завершвем работу функции main()
if (fd == NULL) {
printf("cannot open file for read\n");
return 0;
}
// объявляем массив символов размером BUFFER_SIZE + 1
// почему + 1 ниже, это маленький трюк
char buffer[BUFFER_SIZE + 1];
// расписываем массив нулями, потому
// что в нем может быть мусор
memset(buffer, 0, BUFFER_SIZE + 1);
// пытаемся читать из файла fd по 1 байту-символу,
// результат сколько прочитано сохраняем в переменной
// r типа size_t (это на самом деле число int,
// но вот такой придумали псевдоним)
size_t r = fread(buffer, 1, BUFFER_SIZE, fd);
// выводим на термина сколько выведено символов
// при этом явно преобразуем переменную r из типа size_t в тип int
// если в файле будет символов меньше чем BUFFER_SIZE,
// то прочитается сколько есть
printf("read: %d\n", (int)r);
// выводим строку-символы из буфера
// концом строки считается байт со значением 0
// поэтому мы указали размер буфера в памяти BUFFER_SIZE + 1
// расписали нулями тоже BUFFER_SIZE + 1,
// а считали только BUFFER_SIZE, на байт меньше
// то есть гарантированно в конце будет ноль.
if ((int)r > 0) {
printf("buffer: %s\n", buffer);
}
// закрываем файл
// на самом деле при окончании программы он будет закрыт системой,
// но мы явно делаем закрытие файла и освобождение структур
fclose(fd);
// возвращаем результат функции main()
// 0 - по договоренности в UNIX системах
// значит успешное выполнение программы
return 0;
}
Compile and run
$ cc -Wall -o readfile readfile.c
$ ls -l readfile
$ echo 12345 > sample.txt
$ ./readfile
read: 6
buffer: 12345
Go lang
- readfile.go
/*
* Author, Copyright: Oleg Borodin <onborodin@gmail.com>
*
*/
package main
import (
"fmt"
"os"
)
const (
bufferSize int = 128
)
func main() {
file, err := os.OpenFile("sample.txt", os.O_RDONLY, 0640)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer file.Close()
buffer := make([]byte, bufferSize)
r, err := file.Read(buffer)
if err != nil {
fmt.Printf("error: %v\n", err)
os.Exit(1)
}
fmt.Printf("read: %d\n", r)
if r > 0 {
fmt.Printf("buffer: %s\n", string(buffer))
}
os.Exit(0)
}
Compile and run
$ go build readfile.go
$ ls -l readfile
$ echo qwerty > sample.txt
$ ./readfile
read: 7
buffer: qwerty