【问题标题】:Can't do the conversion from binary to ascii in C language无法在C语言中进行从二进制到ASCII的转换
【发布时间】:2018-04-18 16:42:27
【问题描述】:

我在学校的一个任务是用 C 语言处理文件。我有一个扩展名为 .dat 的文件,可以使用以下代码进行修改。在 .dat 文件中有关于学生的信息(具有 Student 结构)。

使用此代码,在我在控制台中输入某个部门(班级)编号后,我必须为学生的一个成绩添加一些分数。

#include <stdio.h>

typedef struct { 
    int code; 
    char name[30]; 
    int year; 
    int dept; 
    int number; 
    int grade[15]; 
}Student;

void main(){ 
    FILE * f; 
    char s1[20]; 
    Student s; 
    int n, i;
    printf("\nFile: "); 
    gets_s(s1);

    if(!(f = fopen(s1, "rb+")))  printf("\nThe file %s cannot be open", s1);
    else{
        printf("\nClass: "); scanf("%d",&n);
        while(!feof(stdin)){
            rewind(f);
            fread(&s, sizeof(Student), 1, f);
            i = 0;
            while(!feof(f)){
                if(n == s.dept){
                    i = 1;
                    s.grade[0] = (s.grade[0] == 10) ? s.grade[0] : s.grade[0] + 1;
                    fseek(f, ftell(f) - sizeof(Student), 0);
                    fwrite(&s, sizeof(Student), 1, f);
                    fseek(f, 0, 1);
                }
                fread(&s, sizeof(Student), 1, f);
            }
            if(!i) printf("\n No student found in class %d", s.dept);
            printf("\nClass: "); scanf("%d",&n);
        }
        fclose(f);
    }
}

一切都好,但在控制台中我得到了一个奇怪的部门编号。

File: stud.dat

Class: 200

 No student found in class -858993460

我认为这是因为没有从二进制到 ascii 的转换。我搜索了互联网,但没有找到任何可以帮助我的东西。有没有我需要插入的功能或类似的东西?

谢谢!

stud.dat 文件

e   smith þþþþþþþþþþþþ   1            ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌf   james þþþþþþþþþþþþ   ,           ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌg   mike þþþþþþþþþþþ   ê            
   ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌh   jon þþþþþþþþþþþþþþþþ   m         
   ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ

【问题讨论】:

    标签: c file


    【解决方案1】:

    以下建议的代码::

    1. 假设我了解 OP 想要做什么。
    2. 干净编译
    3. 执行(按照理解)功能
    4. 正确检查错误

    现在建议的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_FILENAME_LEN 20
    #define MAX_STUDENT_NAME_LEN 30
    #define MAX_GRADES  15
    
    struct STUDENT
    {
        int code;
        char name[ MAX_STUDENT_NAME_LEN ];
        int year;
        int dept;
        int number;
        int grade[ MAX_GRADES ];
    };
    typedef struct STUDENT Student;
    
    
    int main( void )
    {
        FILE * f;
        char filename[ MAX_FILE_NAME_LEN ];
        Student s;
        int dept;
    
        printf( "\nFile: " );
        fflush( stdout );
        if( !fgets( filename, sizeof( filename ), stdin ) )
        {
            perror( "fgets for file name failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, fgets successful
    
        // remove trailing newline
        filename[ strspn( filename, "\n" ) ] = '\0';
    
        if( !(f = fopen( filename, "rb+" )))
        {
            perror( "fopen failed" );
            fprintf( stderr, "\nThe file %s cannot be open", filename );
            exit( EXIT_FAILURE );
        }
    
        // implied else, fopen successful
    
        printf( "\nClass: " );  // AKA dept
        fflush( stdout );
        if( scanf("%d",&dept) != 1 )
        {
            fprintf( stderr, "scanf for class failed\n" );
            fclose( f ); // cleanup
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        int found = 0;
    
        while( fread( &s, sizeof(Student), 1, f ) == 1 )
        {
            if( dept == s.dept )
            {
                found = 1;
                s.grade[0] =  s.grade[0] == 10 ) ? s.grade[0] : s.grade[0] + 1;
                if( fseek(f, -(long int)(sizeof(Student)), SEEK_CUR) != 0 )
                {
                    perror( "fseek failed" );
                    fclose( f );  // cleanup
                    exit( EXIT_FAILURE );
                }
    
                // implied else, fseek successful
    
                if( fwrite( &s, sizeof( Student ), 1, f ) != 1 )
                {
                    perror( "fwrite failed" );
                    fclose( f );  // cleanup
                    exit( EXIT_FAILURE );
                }
    
                // implied else, fwrite successful
            }
        }
    
        fclose( f );
    
        if( !found )
        {
            printf( "\n No student found in class %d\n", dept );
        }
        return 0;
    }
    

    【讨论】:

    • 我运行了你的代码,得到了这个:File: stud.dat fopen failed: Invalid argument The file cannot be openPress any key to continue . . .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2012-11-14
    相关资源
    最近更新 更多