簡體   English   中英

C fscanf返回null

[英]C fscanf returning null

我的作業有一個問題,其中一部分需要掃描和讀取一些特定的輸入。 相關的C代碼是:

typedef struct Train {
    int train_number;
    int priority;   // 0 is low priority, 1 is high priority
    int direction;  // 0 is Westbound, 1 is Eastbound
    float loading_time;
    float crossing_time;
    int loaded;
} Train;

#define MAX_TRAIN_COUNT 777
Train station[MAX_TRAIN_COUNT];

int main(int argc, char* argv[]) {
    //read the input file
    FILE *input;
    char c;
    int train_count = 0;
    input = fopen(argv[1], "r");

    while((c = getc(input)) != EOF) {
        if(c == '\n')
            train_count++;
    }

    int i;
    for (i = 0; i < train_count; i++) {
        char dir;
        int load, cross;
        fscanf(input, "%c %d %d\n", &dir, &load, &cross);
        printf("%c %d %d\n", dir, load, cross);
    }
    fclose(input);

輸入是3行,由1個char和兩個用空格分隔的整數組成。

e 10 6
W 6 7
E 3 10

我得到的輸出是:

 4195728 0 

4195728之前的位置。我似乎找不到解決此問題的解決方案。

似乎是什么問題?

代碼在第二次讀取數據之前無法倒帶文件。 缺乏檢查輸入功能是否成功的原因是無法暴露問題。 @WhozCraig

int i;
rewind(input); // add
for (i = 0; i < train_count; i++) {

  // fscanf(input, "%c %d %d\n", &dir, &load, &cross);
  if (fscanf(input, "%c %d %d\n", &dir, &load, &cross) != 3) Handle_Error();

更好的方法是在輔助函數中處理讀取數據文件的行。

fscanf()相比,使用fgets()處理麻煩的輸入要好得多。 @放松

int ReadTrainData(Train *data, FILE *stream) {
  char buffer[200];
  if (fgets(buffer, sizeof buffer, stream) == NULL) {
    return EOF;
  }
  // Various ways to parse data.
  // This one look for a completed scan and checks that `n` was changed.
  int n = 0;
  //              v-- add space to consume optional leading white-space (if desired)
  sscanf(buffer, " %c %d %d %n", &data.direction, &data.loading_time,
      &data.crossing_time, &n);
  if (n == 0) return 0; // data incomplete
  if (buffer[n]) return 0; // extra junk in line

  // maybe valid data
  if (strchr("NSEWnsew", &data.direction) == NULL) return 0;
  if (data.loading_time < 0 || data.loading_time > TRAIN_TIME_MAX) return 0;
  // add other validation tests as needed

  return 1;
}

樣品用法

size_t train_count = 0;
if (input) {
  Train data = {0};
  while(ReadTrainData(&data, input) == 1) {
    train_count++;
    printf("%c %d %d\n", data.direction, data.loading_time, data.crossing_time);
  }
  fclose(input);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM