0

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

2 回答 2

0

以下将适用于标准输入或实际文件(即,您可以将“流”替换为标准输入,或将 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';
于 2013-09-28T01:01:19.413 回答
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字符串

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;
}
于 2013-09-28T00:45:02.393 回答