簡體   English   中英

fscanf 用於 C 中的文本文件

[英]fscanf for text files in C

我有一個文件

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   

列之間的空間用tab寫了這是我的代碼但是......

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

和 output:

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

如您所見,“玩具總動員”存儲在兩個不同的字段中,第一部電影的類型數據與第二部電影一起打印。

你能告訴我有什么問題嗎?

問題是%s格式說明符在找到 whitespece 字符(空格、制表符、換行符等)時停止掃描。

這就是為什么“玩具總動員”“四個房間”都存儲在結構的兩個不同字段中的原因,使您的掃描字面上“移位”位置(第一部電影的流派字段將成為第二部電影的第一個字段,依此類推)。

您可以使用%[^\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);

暫無
暫無

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

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