回 帖 发 新 帖 刷新版面

主题:哪位高手能解此惑,感激不尽!(关于fgets()取到的字符串用于库函数时出错的问题))

/*
**2010-12-30
**测试fgets 
*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 255        /*文件名最大长度*/
#define LEN 1000    /*文件写入时用的buffer最大长度*/ 
#define _FGETS 0


int main(void)
{
    FILE    *pFile;
    char FileName[MAX];
    char str[LEN];
    char choice;

    printf("please input the file name:\n");

#if _FGETS

    fgets(FileName,MAX-1,stdin );    /*居然出现能取到FileName数组但用fopen却打不开*/
    fflush( stdin );
    printf("%s",FileName);

#else
    
    gets( FileName );

#endif
/*
**        打开并创建文件 
*/ 
    pFile=fopen( FileName , "wb+" );
    if( pFile ==NULL ){
        perror( FileName );
        exit(EXIT_FAILURE);
    }

    
    fgets( str , LEN-1 ,stdin );
    while( !feof( stdin ) ){
        fputs( str , pFile );
        
        fgets( str ,LEN-1 ,stdin );
    
    }

    fclose( pFile );
    
/*进行文件的删除与重命名操作*/    

    puts("delete the file enter:Y,rename:R");
    
    choice = fgetc( stdin );
    
    if(choice =='Y')
    {
        puts(" please input the new name ");
        fflush( stdin );
    //    fgets( str ,MAX-1 , stdin );
    //    puts(str);
        gets( str );    /*用fgets则操作remove失败,但str数组中却是取到了值的*/
        remove( str );
    }
    else if( choice =='R')
    {
        puts(" please input the new name ");
        fflush( stdin );
    //    fgets( str, MAX-1, stdin ); /*为什么用fgets取得的字符串不能用于rename*/
    //    puts(str);
        gets( str );

        rename( FileName, str );
    }
    else
    {
        puts("NO this option,then exit");
    }

    
    system("pause");
    return 0;
}
[code=c]
请填写代码
[/code]

回复列表 (共3个回复)

沙发

我算明白一件事了,求人不如求己。
出现fgets()所取得的字符串不能被fopen()等函数成功利用的原因:
fgets()取字符串时会在最后加一个空字符,好像是什么NUL字节。所以将字符串用于fopen()时无法成功。
不知各位有何看法。

板凳

初学者,,进来学习学习。。。

3 楼

fgets读取到的字符串,最后有一个回车符。而文件名最后肯定是没有回车符的,所以fopen无法找到对应文件了。只要把最后一个回车符删除即可。

    char name[100];
    fgets(name, sizeof(name), stdin);

    size_t len = strlen(name);
    if (len > 0 && name[len - 1] == '\n')
    {
        name[len - 1] = '\0';
    }

我来回复

您尚未登录,请登录后再回复。点此登录或注册