gpt4 book ai didi

C fscanf 返回 null

转载 作者:行者123 更新时间:2023-11-30 14:50:18 25 4
gpt4 key购买 nike

我的作业有一个问题,部分作业需要扫描和阅读一些特定的输入。相关的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 行,由一个字符和两个以空格分隔的整数组成。

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();
<小时/>

更好的方法是在辅助函数中处理读取数据文件的行。

使用fgets()在处理麻烦的输入方面比fscanf()要好得多。 @unwind

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);
}

关于C fscanf 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49065997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com