从文件

时间:2016-12-19 22:50:57

标签: c

我正在做一个家庭作业,我仍然坚持我的部分代码工作超出了我的理解。我已经搜索了很多论坛,并尝试了其他一些方法来克服这个问题但我找不到解决方案。这是我代码中有问题的部分......

    while(!feof(transmissionsFile)){
        int ret = fscanf(transmissionsFile, "%c %c %d", &tTms.tsn, &tTms.rsn, &tTms.sTime);
        if(ret != 3) continue;

        for(s = 0; s < N; ++s){
            if(tmsMtx[s][tTms.sTime].tsn == ' ' ){
                tmsMtx[s][tTms.sTime] = tTms;
                break;
            }
            continue;
        }       
    }

我正在阅读的文件是一个简单的txt文件:

A B 3
C B 2
C A 1
B A 2
A C 3
B C 4

但是当我尝试读取文件时,它只读取

A B 3
C A 1
A C 3

我已经检查了&#34; ret&#34;的返回值函数,我看到它为读取的那些返回3,对于未读取的那些返回2次2 ... 我也使用完全相同的格式将数据完全读入其他结构......必须有一些我想念的东西,但我无法弄明白。我将不胜感激任何指导:)

这是我为解决这个特定问题所写的全部代码,对于那些可能想知道的人来说,这部分应该创建一个转换矩阵并读取值来填充矩阵。例如:第一行文件的T3中的A到B ......

#include <stdio.h>

int main()  {

    int N = 5;
    //  Opening required files  ############################################    
        FILE *transmissionsFile = fopen("transmissions.txt", "r");
    if ( transmissionsFile == 0 ) {
        printf( "\nCould not open transmissions.txt\n" );
        return 1;
    }   

    //  Structure definitions   ############################################
    typedef struct transmissions {
        char tsn;
        char rsn;
        int sTime;
    } transmission;

    //  Constructing the transissions matrix    ############################
    transmission tTms = {' ', ' ', 0};
    transmission tmsMtx[N][2*N];
    int s,t;
    for(s =0; s < N; s++){
        for(t =0; t < 2*N; t++){
            tmsMtx[s][t] = tTms;
        }
    }

    while(!feof(transmissionsFile)){
        int ret = fscanf(transmissionsFile, "%c %c %d", &tTms.tsn, &tTms.rsn, &tTms.sTime);
        if(ret != 3) continue;

        for(s = 0; s < N; ++s){
            if(tmsMtx[s][tTms.sTime].tsn == ' ' ){
                tmsMtx[s][tTms.sTime] = tTms;
                break;
            }
            continue;
        }       
    }

    //  Print out the transmission matrix   ################################
    system("cls");
    printf ("\n  The transmission matrix \n\n  ");
    for(t =0; t < 2*N; t++){
            printf(" T%d\t", t);
    }
    printf("\n\n");
    for(s =0; s < N; s++){
        printf("  ");
        for(t =0; t < 2*N; t++){
            printf("%c-%c\t", tmsMtx[s][t].tsn, tmsMtx[s][t].rsn);
        }
        printf("\n\n");
    }

    //  Closing files and ending program    ################################    
    fclose(transmissionsFile);

    return 0;
}

1 个答案:

答案 0 :(得分:5)

像@chux和@wildplasser一样说。这是因为你没有使用scanf解析新行:

int ret = fscanf(transmissionsFile, "%c %c %d\n", &tTms.tsn, &tTms.rsn, &tTms.sTime);
if (ret != 3) {
 fprintf(stderr, "something wrong !!!\n");
 continue;
};

喜欢@wildplasser说。您不应该像Why is “while ( !feof (file) )” always wrong?那样使用feof()

int ret;
while ((ret = fscanf(transmissionsFile, "%c %c %d\n", &tTms.tsn, &tTms.rsn,
                     &tTms.sTime)) == 3) {
  // Do what you want
}
if (ret != EOF || ferror(transmissionsFile)) {
  fprintf(stderr, "something wrong !!!\n");
};