在C语言中逐字读取文本文件

问题描述 投票:0回答:3

我正在尝试学习C语言中的文件I / O操作。我的目标是将所有单词从文本文件存储到字符串数组中。

我试图编写一个代码,该代码读取文本文件char by char,并从这些char中创建单词。我想做的是访问带有行和单词索引的单词。您可以帮我吗?

这是我的代码。

char words[MAX_LINE][MAX_WORDS][MAX_CHAR];
int i=1, j=1, k=1;

FILE* ptrbook;
if((ptrbook = fopen("trial.txt", "r")) == NULL)
{
    printf("Failed to open the file %s\n", filename);
}
else
{
    while((words[i][j][k] = getc(ptrbook)) != EOF)
    {
        while((words[i][j][k] = getc(ptrbook)) != '\n')
        {
            while((words[i][j][k] = getc(ptrbook)) != ' ')
            {
                words[i][j][k] = getc(ptrbook);
                k++;
            }
            if((words[i][j][k] = getc(ptrbook)) == ' ' )
            {
                j++;
                k=1;
            }
            if((words[i][j][k] = getc(ptrbook)) == '\n')
            {
                i++;
                j=1;
                k=1;
            }
        }
    }
}
printf("%s\n", words[1][1]);
c arrays pointers file-io
3个回答
0
投票

为此,最容易将文件中的所有内容读取到堆中的动态变量中。因此,在定义变量后,请使用以下函数为变量分配尺寸。

#define SIZE 4096
char * malloc_buff(int dim){
    char *buf;
    buf=malloc(sizeof(char)*dim);
    if(buf==NULL){
        perror("Errore in malloc");
    }
    return buf;
}

然后您执行一个变量,并使用以下函数将文件的所有信息存储在该变量中。代替您的database_prenotazionioni.txt插入您的文件名的名称

char * lettura_database_prenotazioni(){
    FILE* fd;
    char* disponibili;
    disponibili=malloc_buff(SIZE);
    errno=0;
    fd=fopen("database_prenotazioni.txt","r+");
    if(errno!=0){
        fprintf(stderr,"error in open\n");
        exit(-1);
    }
    fread(disponibili,sizeof(char),SIZE,fd);
    if(fclose(fd)){
        fprintf(stderr,"error in closure\n");
        exit(-1);
    }
    return disponibili;
}

现在,您需要对变量进行strtok处理,其中所有内容都包含del \ t。请记住,在下面的函数中分配一个新变量作为array_stringhe变量,该变量应用于函数的返回]

char ** tokenize_elem(char *buffer,char *del){
    int c=1;
    char **array_stringhe=malloc((sizeof(char*)*SIZE));
    if(array_stringhe==NULL){
        fprintf(stderr,"errore in malloc\n");
        exit(EXIT_FAILURE);
    }

    char *token=malloc_buff(SIZE);
    memset(token,'\0',SIZE);
    memset(array_stringhe,'\0',SIZE);
    array_stringhe[0] = strtok (buffer,del);
    //fprintf(stdout,"%s\n",array_stringhe[0]);
    while(token!=NULL){
        token=strtok(NULL,del);
        if(token==NULL){
            break;
        }
        array_stringhe[c]=token;

        //fprintf(stdout,"%s\n",array_stringhe[c]);
        c++;

    }
    free(token);
    return array_stringhe;
}

0
投票

尝试在每个循环中仅调用一次getc(ptrbook),并暂时存储结果。比您可以检查是否有分割字符,例如空格和换行符。当前,您在每个while循环中从一个字符跳到另一个字符,这不是您想要的。

执行类似操作:

int c;
while((c = getc(ptrbook)) != EOF){
    if(c == ' ') 
        j++;
    else if(c == '\n') 
        i++;
    else 
        words[i][j][k++] = c;
}
© www.soinside.com 2019 - 2024. All rights reserved.