C语言scanf不停止

标签 c input file-io

我有这段代码,我想从文本文件中获取信息并创建一个结构数组并将它们保存在一个新的 bin 文件中。问题是, while 中的 fscanf 并没有停止。 txt 文件就像这样“23A45 Lisboa 15.00 Coimbra 17.00 Aveiro 17.45 Porto 18.20”

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 20

struct paragem{
char local[TAM];
float hora;
};

int main()
{
FILE *f, *p;
struct paragem c;
char linha[TAM];

f = fopen("perc.txt", "rt");
if(f==NULL)
{
    printf("erro ao abrir ficheiro txt");
}
p = fopen("rota.bin", "wb");

if(p == NULL)
{
    printf("erro ao abrir ficheiro bin");
}
fscanf(f, "%s", &linha);
while(fscanf(f, " %s", &linha) != NULL )
{
    strcpy(c.local,linha);
    fscanf(f, " %f", &c.hora);
    fwrite(&c, sizeof(c), 2, p);
}
return 0;
}

最佳答案

fscanf 返回匹配的项目数,或文件末尾的 EOF(通常为 -1)。所以你想说

while(fscanf(f, " %s", linha) == 1 )

由于 NULL 为 0,并且 fscanf 在成功匹配时返回 1,在到达文件末尾时返回 -1,这可能解释了为什么会出现无限循环。

顺便说一句,我还将您的 &linha 更改为 linha。通常,您在传递给 scanf 的变量上需要使用 &异常(exception),当您使用 %s 读取字符串时>。在这种情况下,由于 linha 是一个数组,因此会自动传递指针,而无需使用 &

关于C语言scanf不停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50558992/

相关文章:

c - 可以在循环的括号内定义循环变量吗?

c - 如何在 C 中获取 WAV 文件的持续时间?

c - 生成正弦波超过 1 秒时出现问题

AngularJS 将今天设置为输入日期

java - 有没有办法让我能够对 System.in 输入和 FileInputStream 输入使用相同的扫描仪?

Python 无法在 r+ 模式下打开 11gb csv 但在 r 模式下打开

c++ - sigqueue 可以与 pthreads 一起使用吗?

java - 使用 java.io 进行基本输入验证

java - 如何用java创建我自己的文件格式

c++ - XCode、标准 C++ 和 ifstream 文件处理