第一部分:关于文件句柄
该stdin
变量包含一个 FILE 句柄,用户输入将重定向到该句柄(FILE 数据类型在 stdio.h 中定义)。您可以使用函数创建文件句柄FILE *fopen(const char *path, const char *mode)
。
您应用于常规文件的示例将是这样的(不进行错误检查):
int main() {
int c;
FILE *myfile = fopen("path/to/file", "r"); //Open file for reading
while(!feof(myfile)) {
c = fgetc(myfile);
//do stuff with 'c'
//...
}
fclose(myfile); //close the file
return 0;
}
fopen
有关此处的更多信息:http: //linux.die.net/man/3/fopen
第二部分:关于C字符串
C 字符串(char
以空字符结尾的数组'\0'
)可以通过多种方式定义。其中之一是通过静态定义它们:
char mystring[256]; //This defines an array of 256 bytes (255 characters plus end null)
注意缓冲区的限制非常重要。在我们的示例中,在缓冲区中写入超过 256 个字节将使程序崩溃。如果我们假设我们的文件不会有超过 255 个字符的行(包括像 \r 和 \n 这样的行终止符),我们可以使用fgets
函数(http://linux.die.net/man/3/fgets):
char *fgets(char *s, int size, FILE *stream);
简单(新手)示例:
int main() {
char mystring[256];
FILE *myfile = fopen("path/to/file", "r"); //Open file for reading
while(!feof(myfile)) {
if (fgets(mystring, sizeof(mystring), myfile) != NULL) {
printf("%s", mystring);
}
}
fclose(myfile); //close the file
return 0;
}
请注意,fgets
它用于读取行。如果要逐个读取字符,则应继续使用fgetc
并将它们手动推送到缓冲区中。
最后,如果要将整个文本文件读入 C 字符串(无错误检查):
int main() {
FILE *myfile = fopen("path/to/file", "r"); //Open file for reading
//Get the file size
fseek(myfile, 0, SEEK_END);
long filesize = ftell(myfile);
fseek(myfile, 0, SEEK_SET);
//Allocate buffer dynamically (not statically as in previous examples)
//We are reserving 'filesize' bytes plus the end null required in all C strings.
char *mystring = malloc(filesize + 1); //'malloc' is defined in stdlib.h
fread(mystring, filesize, 1, myfile); //read all file
mystring[filesize] = 0; //write the end null
fclose(myfile); //close file
printf("%s", mystring); //dump contents to screen
free(mystring); //deallocate buffer. 'mystring' is no longer usable.
return 0;
}