【问题标题】:fscanf for text files in Cfscanf 用于 C 中的文本文件
【发布时间】:2020-07-08 20:45:30
【问题描述】:

我有一个文件

1   Toy Story   1995    01-Jan-1995 http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)   Animation|Children's|Comedy 
2   GoldenEye   1995    01-Jan-1995 http://us.imdb.com/M/title-exact?GoldenEye%20(1995) Action|Adventure|Thriller   

并且列之间的空间已经用制表符写了 这是我的代码,但是...

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <unistd.h>

FILE *MovieF;
void addFileM();

struct Movies
{
   char MID[50];
   char MName[50];
   char MYear[50];
   char MDate[50];
   char MIMDB[100];
   char MGen[100];
}Movie[100];


int main()
{
    addFileM();
    return 0;
}


void addFileM()
{
    MovieF = fopen("d:\\movies.txt","r");
    for(int i=0;i<60;i++)
    {
        fscanf(MovieF, "%s\t%s\t%s\t%s\t%s\t%s\n",Movie[i].MID,Movie[i].MName,Movie[i].MYear,Movie[i].MDate,Movie[i].MIMDB,Movie[i].MGen);
    }
    for(int i=0;i<60;i++)
    {
        printf("%s\n%s\n%s\n%s\n%s\n%s\n\n",
                Movie[i].MID, Movie[i].MName, Movie[i].MYear,
                Movie[i].MDate, Movie[i].MIMDB, Movie[i].MGen);
    }
}

和输出:

1
Toy
Story
1995
01-Jan-1995
http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)

Animation|Children's|Comedy
2
GoldenEye
1995
01-Jan-1995
http://us.imdb.com/M/title-exact?GoldenEye%20(1995)

Action|Adventure|Thriller
3
Four
Rooms
1995
01-Jan-1995

如您所见,“玩具总动员”存储在两个不同的字段中,第一部电影的流派数据与第二部电影一起打印。

你能告诉我有什么问题吗?

【问题讨论】:

  • A) 请使用完整的单词,而不是像“u”这样的简写,这可能会让非英语母语人士感到困惑或不熟悉。 B) 你能解释一下你认为问题出在哪里吗?
  • 您引用的输出与您的输入不对应;
  • 您的程序没有按预期运行吗?

标签: c scanf


【解决方案1】:

问题是%s 格式说明符会在发现whitespece char(空格、制表符、换行符等)时停止扫描。

这就是为什么 “玩具总动员”“四个房间” 都存储在结构的两个不同字段中的原因,使您的扫描字面上“转移”位置(类型第一个电影的字段将成为第二个电影的第一个字段,依此类推)。

您可以使用%[^\t],而不是使用%s

方括号 格式说明符扫描包含一组字符的字符串。但如果出现^,则避免包含该字符。所以在这种情况下,它意味着“存储字符串并在找到第一个选项卡时停止”

更好的是:您可以选择使用%N[^\t] 格式最多存储N 个字符。给定目标数组的大小,只需将 N 指定为此大小减一(为字符串终止符留出空间)。

您的fscanf 将变为:

fscanf(MovieF, "%49[^\t]%49[^\t]%49[^\t]%99[^\t]%99[^\t]\n",
       Movie[i].MID, Movie[i].MName, Movie[i].MYear,
       Movie[i].MDate, Movie[i].MIMDB, Movie[i].MGen);

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多