C语言文件读取fgets如何读取最后一行?

//打开文件写入数据
FILE *file = fopen("data.txt","w");//a追加写

//无法打开文件
if(file==NULL)
{
    
    
return 1;
}

//一行一行输入数据
for(i=0;i<t;i++)
{
    
    
    //输入单case数据并临时存到digs
    scanf("%d",&n);
    for(j=0;j<n;j++)
    {
    
    
        scanf("%d",&digs[j]);
        fprintf(file,"%d ",digs[j]);
    }

    fprintf(file,"\n");//一个case一行

}


// 关闭文件
fclose(file);

// 重新打开文件以读取数据并进行操作
    file = fopen("data.txt", "r");
    if (file == NULL) {
    
    
        printf("无法打开文件。\n");
        return 1;
    }
// 逐行读取数据并进行操作
i = 0;//循环n
//读取t行
while(fgets(line,sizeof(line),file)!=NULL)//单个样例:逐行读取,循环体内是读取一行后的操作
{
    
    
    //打印读取结果
    printf("读取:%s",line);

    //使用空格分隔字符串
    char *token = strtok(line," ");
    while(token != NULL)//指针不为空,也就是指向数据
    {
    
    
        //将字符串转换为整数并存入数组
        //每一行一个数一个数的村、存
        digs[i++]=atoi(token);
        token = strtok(NULL," ");//把strtok执行后返回的下一个字符的首地址(指针)赋值给token,实现了指针的后移
    }
    //读完了,存完了,进行操作
}

结果

输入4行数据,成功写入data.txt
但是读取的时候最后一行没有换行符,没有被读取

修正

//打开文件写入数据
FILE *file = fopen("data.txt","w");//a追加写

//无法打开文件
if(file==NULL)
{
    
    
return 1;
}

//一行一行输入数据
for(i=0;i<t;i++)
{
    
    
    //输入单case数据并临时存到digs
    scanf("%d",&n);
    for(j=0;j<n;j++)
    {
    
    
        scanf("%d",&digs[j]);
        fprintf(file,"%d ",digs[j]);
    }

    fprintf(file,"\n");//一个case一行

}



// 关闭文件
fclose(file);

// 重新打开文件以读取数据并进行操作
    file = fopen("data.txt", "r");
    if (file == NULL) {
    
    
        printf("无法打开文件。\n");
        return 1;
    }
// 逐行读取数据并进行操作
int sampleIndex = 0; // 用于追踪每个样例内的索引
while(fgets(line,sizeof(line),file)!=NULL)//单个样例:逐行读取,循环体内是读取一行后的操作
{
    
    
    printf("读取:%s",line);


    // 检查是否读取到有效字符
    if (strlen(line) == 0) {
    
    
        break; // 退出循环,避免重复读取最后一行
    }

    //使用空格分隔字符串
    char *token = strtok(line," ");
    while(token != NULL)//指针不为空,也就是指向数据
    {
    
    
        //将字符串转换为整数并存入数组
        //每一行一个数一个数的村、存
        digs[sampleIndex++]=atoi(token);
        token = strtok(NULL," ");//把strtok执行后返回的下一个字符的首地址(指针)赋值给token,实现了指针的后移
    }

     // 如果已经读取了一个样例的数据,重置索引
    if (sampleIndex >= n)
    {
    
    
        sampleIndex = 0;

    //每个样例要算n个result
    //调用product进行累乘并返回result存到数组res[j]
    for(j=0;j<n;j++)//每个样例要算n个result
    {
    
    
         res[j] = Product(digs,n,j);//传值调用
         //j+1 是有效的函数参数
         //传入j是为了对应add的操作对象

    }

    //算完了,排序查找最大值
    //调用Maxres对数组res进行排序查找并返回最大值maxres(传地址调用)
    maxres = MaxRes(res,n);//传值

    printf("%d\n",maxres);
    }
}


// 关闭文件
fclose(file);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_62865498/article/details/133723939
今日推荐