例如,如果我有一个文件名random.txt,其内容为:
这是一个字符串 ABC
Zxy
如何将random.txt中的字符保存到包含文本文件中所有字符的字符串或数组?
到目前为止,我已经(使用重定向文件)
#include <stdio.h>
#include <string.h>
int main () {
int c;
do {
c = fgetc(stdin);
putchar(c);
} while (c != EOF);
return 0;
}
答案 0 :(得分:0)
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
可以用多种方式定义以空字符char
结尾的C字符串('\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;
}
答案 1 :(得分:0)
以下内容适用于stdin或实际文件(即您可以用stdin替换“stream”,或者用文件名替换fopen()),动态分配。运行后,“ptr”将是一个指向包含文件内容的数组的指针。
/* read chars from stream in blocks of 4096 bytes,
dynamically allocating until eof */
size_t bytes_read = 0;
char * ptr = NULL;
while (1) {
size_t chunk_read;
/* increase size of allocation by 4096 bytes */
ptr = realloc(ptr, bytes_read + 4096);
/* read up to 4096 bytes to the newest portion of allocation */
chunk_read = fread(ptr + bytes_read, 1, 4096, stream);
bytes_read += chunk_read;
/* if fread() got less than the full amount of characters, break */
if (chunk_read < 4096) break;
}
/* resize pointer downward to actual number of bytes read,
plus an explicit null termination */
bytes_read += 1;
ptr = realloc(ptr, bytes_read);
ptr[bytes_read - 1] = '\0';