【问题标题】:Read strings in C from txt file从 txt 文件中读取 C 中的字符串
【发布时间】:2017-12-06 23:21:58
【问题描述】:

我正在尝试从 txt 文件中读取一些字符串。 每行有一个5位数字,一个占51个字符(包括空格)的全名,2个城市名称,每个占11个字符,包括空格,以及一个数字。示例:

12345António Manuel Silva Mendes                        Frankfurt  Varsovia    1

我现在可以扫描前 2 个字符串,但无法扫描城市名称,也无法扫描最后一个数字。

结构如下:

typedef struct bilhete{

    int BI;
    char nome[51];
    char partida[11];
    char chegada[11];
    int data[2];

}BILHETE;

这是我读取文件的方式

while(!feof(fp)){

        fscanf(fp,"%d%51[^\n]s%11c%11c%d\n", &bilhete.BI, bilhete.nome, bilhete.partida, bilhete.chegada, &bilhete.data);

我做错了什么?当我打印城市名称时,什么都没有出现!

【问题讨论】:

  • fscanf 返回什么?这是什么意思?
  • while(!feof(fp)) 是错误的。 stackoverflow.com/questions/5431941/…
  • 鉴于输入字段的大小,结构定义字符字段太短了 1 个字符。这是因为在为 scanf() 系列函数调用 any 时,输入格式说明符 %s%[...] 总是在输入末尾附加一个 NUL 字节。
  • fscanf() 的调用在输入格式说明符%51[^\n] 之后有一个虚假的's' 输入数据中不存在's',因此输入活动将在那里停止。如果您一直在检查来自fscanf() 的返回值(在当前情况下应该是:5),它将返回 2。您似乎对 '%[]' 输入说明符有误解。这是一个“独立”说明符,因此不需要尾随“s”。
  • 一般来说,永远不要在while循环中使用feof()。对于当前场景,将其用于while 语句:while( 5 == fscanf(fp,"%d %51[^\n] %11c %11c %d\n", &bilhete.BI, bilhete.nome, bilhete.partida, bilhete.chegada, &bilhete.data) )

标签: c string file


【解决方案1】:

由于您有固定的列,我会考虑只读取数据并使用以下内容进行自己的扫描:

char linein[200];
char *p;

while (fgets(linein, sizeof(linein), fp))
{
    char biBuf[10]={0};
    char dataBuf[10]={0};

    p=linein;
    memcpy(biBuf,linein,5);
    bilhete.BI=atoi(biBuf);
    p+=5;
    memcpy(bilhete.nome,p,51);
    p+=51;
    memcpy(bilhete.partida,p,11);
    p+=11;
    memcpy(bilhete.chegada,p, 11);
    p+=11;
    memcpy(dataBuf,p,2);
    bilhete.data[0]=atoi(dataBuf);
    printf("%.51s %d\n",bilhete.nome, bilhete.data[0]);
}

我不确定你想对 data 变量做什么,但这会给你一个整数。请注意,biBuf 和 dataBuf 变量是在循环中分配的,因此它们每次都设置为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 2021-07-07
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多