一个新的的或则一个存在的文件的流能够通过I/0流的fopen函数。这个fopen函数的取文件名,和打开模式作为参数,和返回对于这流的指针。
FILE* fopen(const char* filename,const char* opentype);
对于这个fopen函数的第二个参数,这个打开类型,是一个字符串控制文件怎样被打开。它应该是以下的打开类型之一:
r:作为只读的打开一个存在的文件。
w:打开一个只写的文件。如果这个文件已经存在,它被裁减为0长度。
a:打开文件在附加模式。文件内容是被保存,和这新的输出附加到文件的末尾。如果文件存在,一个新文件被打开。
r+:打开一个读写文件。
w+:打开一个读写文件模式。如果这个文件已经存在,它被裁减为0长度。
a+:打开这个文件读和附加。这文件初始化被设置到读的开始和附加文件的末尾。
如果文件不能用需要的模式的不能被打开,这fopen函数返回一个NULL指针。这例子下,一个流指针,一个FILE指针,为和流的通信被返回,如下:
#include <stdio.h>
...
FILE* stream = fopen("/data/data/com.example.hellojni/test.txt", "w");
if (NULL == stream)
{
/* File could not be opened for writing. */
}
else
{
/* Use the stream. */
/* Close the stream. */
}
写到流:
Stream I/0提供是个函数来写到流。这个部分将简要的浏览这些函数。
写块数据到流:
这fwrite函数能够被用来写块的数据到流:
size_t fwrite(const void* data, size_t size, size_t count, FILE* stream);
fwite函数写移动数量的元素到给定的流。
= fwrite(data, sizeof(char), count, stream))
写字符序列到流:
没有终止符号的序列使用fputs函数写到一个流。
int fputs(const char* data, FILE* stream);
/* Writing character sequence to stream. */
if (EOF == fputs("hello\n", stream))
{
/* Error occured while writing to the stream. */
}
不能被写到流,fputs函数将返回EOF。
写一个单独字符到流:
一个单独的字符或字节被写到一个流使用fputc函数:
int fputc(int c, FILE* stream);
如下:这个fputc函数去这单独的字符作为一个整形数和转化它到一个无符号的字符写到这个给定的流,命名的Stream。
char c = 'c';
/* Writing a single character to stream. */
if (c ! = fputc(c, stream))
{
/* Error occured while writing character to string.
}
如果不能被写到流,fputs函数将返回EOF,否则将返回这字符自己。
写指定的格式的数据到流中:
这个fprintf函数能够被用来格式化和输出变量的参数的的数量到给定的流.
int fprintf(FILE* stream,const char* format,...);
它去一个指针到流,这个格式化字符串,和参数的的变量数目用指定的格式被引用。这个格式字符串有普通的字符串的和 指定格式。普通的格式字符被传递不能改到流。指定格式引发这个fprintf函数到个格式和写这给定的参数到流。这最频繁使用的自定符如下:
%d,%i:整形参数。%u:无符号。%o:无符号的octal。等
/* Writes the formatted data. */
if (0 > fprintf(stream, "The %s is %d.", "number", 2))
{
/* Error occurred while writing formatted data. */
}
I/o流提供这个fflush函数使应用程序到自动刷新缓存区被需要。
int fflush(FILE* stream);
如下,这个ffluse函数采用流指针和刷新输出缓存区的。
char data[] = { 'h', 'e', 'l', 'l', 'o', '\n' };
size_t count = sizeof(data) / sizeof(data[0]);
/* Write data to stream. */
fwrite(data, sizeof(char), count, stream);
/* Flush the output buffer. */
if (EOF == fflush(stream))
{
/* Error occured while flushing the buffer. */
}
从流中读:
和写相似,I/0提供了四个函数读从流中。
从流中读块的数据
这fread函数能够被用来读块数据从这个流。
size_t fread(void* data,size_t size,size_t count,FILE* stream);
例如:
char buffer[5];
size_t count = 4;
/* Read 4 characters from the stream. */
if (count ! = fread(buffer, sizeof(char), count, stream))
{
/* Error occured while reading from the stream. */
}
else
{
/* Null terminate. */
buffer[4] = NULL;
/* Output buffer. */
MY_LOG_INFO("read: %s", buffer);
}
在这个例子,返回的元素数量被传递给的值得数量相等。
读字符序列从流中:
这个fgets函数被用来读一个换行终止符号的字符字符串来自给定的流。
char* fgets(char* buffer,int count,FILE* stream);
这个fgets函数读最多count-1个字符和包含这个换行符在字符数组从给定的命名流中。
char buffer[1024];
/* Read newline terminated character sequence from the stream. */
if (NULL == fgets(buffer, 1024, stream))
{
/* Error occured while reading the stream. */
}
else
{
MY_LOG_INFO("read: %s", buffer);
读单个字符:
unsigned char ch;
int result;
/* Read a single character from the stream. */
result = fgetc(stream);
if (EOF == result)
{
/* Error occured while reading from the stream. */
}
else
{
/* Get the actual character. */
ch = (unsigned char) result;
}
If end-of-file indicator for the stream is set, it returns EOF
读指定格式的字符:
char s[5];
int i;
/* Stream has "The number is 2" */
/* Reads the formatted data. */
if (2 ! = fscanf(stream, "The %s is %d", s, &i))
{
/* Error occured while reading formatted data. */
}
检查文件的末尾:
当从一个流中读时,这个feof的函数被用来检查如果文件结束指定符对于流被设定。
int feof(FILE* stream);
char buffer[1024];
/* Until the end of the file. */
while (0 == feof(stream))
{
/* Read and output string. */
fgets(buffer, 1024, stream);
MY_LOG_INFO("read: %s", buffer);
fseek函数:
fseek函数使用流指针,这个相似的offset,和这作为这引用点:
SEEK_SET:流的开始。
SEEK_CUR:现在的位置
SEEK_END:流的结束。
例子代码如下,写4个字符,重定位返回流的4个字节和重写他们使用一个不同的字符。/* Write to the stream. */
fputs("abcd", stream);
/* Rewind for 4 bytes. */
fseek(stream, -4, SEEK_CUR);
/* Overwrite abcd with efgh. */
fputs("efgh", stream);
错误检测在这个例子代码中被忽略。这个fseek函数将返回0,如果这个操作室成功了;否则一个非零的值指示了失败。
检测错误:
大部分的I/0流函数将返回EOF来指示错误和报告文件末尾。这个ferror函数能够被用来检测如果一个错误被发生了在上一个操作中。
int ferror(FILE* stream);
/* Check for the errors. */
if (0 ! = ferror(stream))
{
/* Error occured on the previous request. */
}
关闭流:
流可以被关闭使用fclose函数。任何缓存的输出被写到流,和任何缓存的输入被抛弃的。
int fclose(FILE* stream);
if (0 ! = fclose(stream))
{
/* Error occured while closing the stream. */
}
这个错误指示这缓存的输出不能写到流中因为在磁盘上没有足够的空间。很好的习惯来检测fclose函数的返回值。