逐行读取txt文件并处理每个单词

时间:2017-10-07 13:29:38

标签: c file

int main(void)
{
    FILE* fp;
    char buffer[500];
    char tempstr[500];
    int i = 0;
    int j = 0;
    fp = fopen("aFaire.txt", "r");

    while(fgets(buffer, 500, (FILE*) fp)) {
        i = 0;
        j = 0;
        while ((buffer[i]!='\n')&&(buffer[i]!='\0'))
        {
            if (buffer[i] !=' '){
                tempstr[j] = buffer[i];
                i++;
                j++;
            }
            else{
                tempstr[j]='\0';
                j=0;
                i++;
                printf("%s",tempstr);
                printf("\n");
            }
        }
    }  
    fclose(fp);
}

我想要做的是逐行读取一个txt文件,然后我单独处理该行中的每个单词,首先我读取缓冲区var中的行,然后复制tempstr中的每个单词,事情是tempstr吃了一些话。

1 个答案:

答案 0 :(得分:0)

您可以使用fscanf()更轻松地完成此操作。

您需要从输入文件中获取所有单词并打印它们。

while(fscanf(fp, "%s", buffer)==1)
{
    printf("\n%s", buffer);
}

fscanf()返回成功分配的数量。如果此处不是1,则文件已结束或发生了一些错误。

在每次迭代中,一个单词将被读入buffer,然后将显示。

并确保fopen()确实打开了该文件,确保fp不是NULL

if( (fp = fopen("aFaire.txt", "r"))==NULL)
{
    perror("\nUnable to open input file");
    return 1;
}

编辑:

在你的程序中,当角色为\n(空格)时,循环停止。但是之前的人物也可能形成一个词。

while循环结束时,添加

tempstr[j]='\0';
printf("%s\n", tempstr);

此外,行i++;出现在if循环内的elsewhile部分。因此,i++; - if之外的一个else代替两个else就足够了。

printf("%s",tempstr); printf("\n"); 部分内,

printf("%s\n",tempstr);

可以组合成

while(fgets(buffer, 500, (FILE*) fp)) {
    i = j = 0;
    while ((buffer[i]!='\n')&&(buffer[i]!='\0'))
    {
        if (buffer[i] != ' '){
            tempstr[j] = buffer[i];
            j++;
        }
        else{
            tempstr[j]='\0';
            printf("%s\n",tempstr);
        }
        i++;
    }
    tempstr[j]='\0';
    printf("%s\n", tempstr);
}

for

事实上,我认为while循环更适合而不是内部while(fgets(buffer, 500, (FILE*) fp)) { for (i=j=0; (buffer[i]!='\n')&&(buffer[i]!='\0'); i++) { if (buffer[i] != ' '){ tempstr[j] = buffer[i]; j++; } else{ j=tempstr[j]='\0'; printf("%s\n",tempstr); } } tempstr[j]='\0'; printf("%s\n", tempstr); } 循环。

SELECT *
    FROM rooms r
    JOIN amenities_room am 
      ON r.id = am.room_id 
    JOIN amenities a 
      ON am.amenities_id = a.id
     AND a.id IN (2,3)
GROUP BY r.id
  HAVING COUNT(*)=2;