【问题标题】:How do read in the file and store it?如何读取文件并存储它?
【发布时间】:2013-12-07 20:58:00
【问题描述】:

所以我试图读入一个文件并将其存储到我的数据结构中,但是每次我运行它时,它要么读入垃圾数据,而且我的结构用 0 填充。有什么建议么?

我有检查数据是否有效的函数,因为我的结构不能存储它已经存储的数据(例如相同的端口或 VMN)。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>


typedef struct DataType{
    double timeOffset;
    int vmn;
    int port;
}Data;

void insertDataType(Data *Data, double timeOffset, int vmn, int port){
    Data->timeOffset = timeOffset;
    Data->vmn = vmn;
    Data->port = port;
}

double returnTimeOffset(Data D){
    assert(D.timeOffset != 0.0);
    return D.timeOffset;
}

int returnVMN(Data D){
    assert(D.vmn != 0);
    return D.vmn;
}

int returnPort(Data D){
    assert(D.port != 0);
    return D.port;
}

bool vmnValid(Data *Data, int n, int vmn){
    int i;
    for(i = 0; i <= n; i++){
        if(Data[i].vmn != 0){
            if(Data[i].vmn == vmn){
                printf("Invalid vmn %d: vmn already inserted \n", vmn);
                return false;
            }
        }
    }
    return true;
}

bool timeValid(Data *Data, int n, double timeOffset){
    int i;
    for(i = 0; i <= n; i++){
        if(Data[i].timeOffset != 0.0){
            if(Data[i].timeOffset == timeOffset){
                printf("Invalid timeOffset %2lf: timeOffset already used \n", timeOffset);
                return false;
            }
        }
    }
    return true;
}

bool portValid(Data *Data, int n, int port){
    int i;
    for(i = 0; i <= n; i++){
        if(Data[i].port != 0){
            if(Data[i].port == port){
                printf("Invalid port %d: port already in use\n", port);
                return false;
            }
        }
    }
    return true;
}


int main(int argc, const char * argv[]){
    int n = 0;
    int i = 0;
    char c;
    FILE *file;

    // Open file
    file = fopen("connect1.in", "r");
    if (file == NULL) {
        fprintf(stderr, "Invalid input file \n");
        exit(1);
    }

    // Get number of lines (n)
    while((c = fgetc(file))!= EOF){
        if(c == '\n'){
            n++;
        }
    }

    printf("n = %d \n", n);

    // Create a strut DataType of size n
    Data *storage;
    storage = calloc(n, sizeof(struct DataType));

    // Read and insert the data
    double timeOffset;
    int vmn;
    int port;

    printf("\n");
    while(fscanf(file, "%lf,%d,%d,", &timeOffset, &vmn, &port != EOF)){
        printf("%lf %d %d \n", timeOffset, vmn, port);
        if(timeValid(storage, n, timeOffset)){
            if(vmnValid(storage, n, vmn)){
                if(portValid(storage, n, port)){
                    insertDataType(&storage[vmn], timeOffset, vmn, port);
                }
            }
        }
    }
    printf("\n");

    printf("\n");
    printf("Storage:\n");
    for(i = 0; i <= n; i++){
        printf("%3d:   %2lf  %d  %d \n", i, storage[i].timeOffset, storage[i].vmn, storage[i].port);
    }
}

【问题讨论】:

    标签: c file scanf


    【解决方案1】:

    计算行数后,文件指针必须再次重置到文件的开头。

    使用 rewind() 调用,在行计数循环后将文件位置重置回文件开始:

    rewind(file);
    

    【讨论】:

    • 我认为这是修复它的原因。非常感谢。
    • 不客气。不要忘记将答案勾选为已接受的解决方案,谢谢。
    【解决方案2】:

    改变

    // while(fscanf(file, "%lf,%d,%d,", &timeOffset, &vmn, &port != EOF)){
    while(fscanf(file, "%lf,%d,%d,", &timeOffset, &vmn, &port) != EOF){
    // or better 
    while (fscanf(file, "%lf,%d,%d,", &timeOffset, &vmn, &port) == 3) {
    

    @suspectus 正确,加rewind(file);

    // change
    // char c;
    int c;
    

    次要注意事项:

    Data *storage;
    // storage = calloc(n, sizeof(struct DataType));
    // I like the style
    storage = calloc(n, sizeof(*storage));
    
    // In a number of places, function do not change *Data, so use `const`
    // Useful to now, at a glance, that *Data is unchanged
    //   and forces the compiler to warn otherwise.
    // bool vmnValid(Data *Data, int n, int vmn){
    bool vmnValid(const Data *Data, int n, int vmn) {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多