我正在尝试学习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]);
为此,最容易将文件中的所有内容读取到堆中的动态变量中。因此,在定义变量后,请使用以下函数为变量分配尺寸。
#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;
}
尝试在每个循环中仅调用一次getc(ptrbook),并暂时存储结果。比您可以检查是否有分割字符,例如空格和换行符。当前,您在每个while循环中从一个字符跳到另一个字符,这不是您想要的。
执行类似操作:
int c;
while((c = getc(ptrbook)) != EOF){
if(c == ' ')
j++;
else if(c == '\n')
i++;
else
words[i][j][k++] = c;
}