如何将文件的字符保存到字符串或数组中?

时间:2013-09-28 00:39:40

标签: c arrays string file-io

例如,如果我有一个文件名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;
}

2 个答案:

答案 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

第二部分:关于C字符串

可以用多种方式定义以空字符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';