将文件读取到字符串数组

时间:2014-07-23 10:57:18

标签: c

我是C的新手,只是了解malloc和realloc,并帮助社区了解如何做到这一点。我有一个带有段落的文件,我需要逐行读取并将行存储在数组o字符串中,同时动态创建数组。

如果这还不够,那么要存储的MAX行数是10,我们使用realloc将内存加倍并打印一条消息,指示我们重新分配了内存。到目前为止,这是我所拥有的,需要帮助才能完成

int main(int argc, char* argv[])
{
  char* p = malloc(10* sizeof(char));
  while(buffer, sizeof(buffer), stdin)
  {

  }
}

2 个答案:

答案 0 :(得分:0)

while(buffer, ...什么都不做,请使用fgets

data.txt中:

one
two
three

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUF_LEN 32

extern char *strdup(const char *);

int main(void)
{
    char **arr = NULL;
    char buf[BUF_LEN];
    size_t i, n = 0;
    FILE *f;

    f = fopen("data.txt", "r");
    if (f == NULL) {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    while (fgets(buf, BUF_LEN, f)) {
        arr = realloc(arr, sizeof(*arr) * (n + 1));
        if (arr == NULL) {
            perror("realloc");
            exit(EXIT_FAILURE);
        }
        arr[n] = strdup(buf);
        if (arr[n++] == NULL) {
            perror("strdup");
            exit(EXIT_FAILURE);
        }
    }
    for (i = 0; i < n; i++) {
        printf("%s", arr[i]);
        free(arr[i]);
    }
    free(arr);
}

答案 1 :(得分:0)

你说过,你确实需要一串字符串。想想看,字符串是一个字符序列/数组,对吧?所以你需要一组字符数组。

现在,char *能够指向一个角色并间接指向后续角色(如果有的话)。这就是我们所说的字符串,以及我们如何拥有它:

char * astring = malloc( 256 * sizeof * astring );
// astring holds an adress pointing to a memory location
// which has the capacity of 256 *astring s

// astring is a string tha can hold 255 characters
// with the full-stop '\0' at the end

现在你需要10个这样的,10个char *个。 char **可以指向他们,就像char *可以char一样。

char ** lines = malloc( 10 * sizeof * lines );
for ( int i = 0; i < 10; i++ )
    lines[i] = malloc( 256 );
    // sizeof may be omittid for chars

如果您计划增加10,最好将其存储在变量中,在需要时将其加倍并相应地重新分配。

int numlines = 10;
int linelength = 256;
char ** lines = malloc( numlines * sizeof * lines );
for( int linenr = 0; fgets( lines[linenr] = malloc( linelength ), linelength, yourfile ) != EOF; linenr++ ) {
    if ( linenr + 1 == numlines ) {
        numlines *= 2;
        lines = realloc( lines, numlines * sizeof * lines );
    }
}

包含必要的标题,填写空白并检查分配和fopen是否成功,确保256就足够了,必要时增加。您也可以选择自适应,但这需要更多代码。