C ++读取制表符分隔的输入和跳过空白字段

时间:2015-05-27 22:14:50

标签: c++ variables input format tab-delimited

我正在创建一个程序,该程序将用户将一长串制表符分隔的元数据粘贴到控制台中,并将它们分成正确的变量。我已经完成了按标签拆分行的代码,但是有一些空字段应该被跳过,以便将正确的元数据放入正确的字符串变量中,这是我无法工作的。

这是我到目前为止的代码:

string dummy;
string FAImport;
cin.ignore(1000, '\n');
cout << "\nPlease copy and paste the information from the finding aid and press Enter: ";
getline(cin, FAImport);
cout << FAImport;

stringstream ss(FAImport);

auto temp = ctype<char>::classic_table();
vector<ctype<char>::mask> bar(temp, temp + ctype<char>::table_size);

bar[' '] ^= ctype_base::space;

ss.imbue(locale(cin.getloc(), new ctype<char>(bar.data())));

ss >> coTitle >> altTitle >> description >> dateSpan >> edition >> publisher >> 
physicalDescription >> scale >> extentField >> medium >> dimensions >> arrangement >> 
degree >> contributing >> names >> topics >> geoPlaceNames >> genre >> occupations >> 
functions >> subject >> langIN >> audience >> condition >> generalNotes >> collection >> 
linkToFindingAid >> source >> SIRSI >> callNumber;

checkFAImport(); //shows the values of each variable
cout << "\n\nDone";

使用此代码,我在输入元数据后得到此输出:

coTitle = William Gates photograph with Emiliano Zapata
altTitle = 1915
description = 1915
datespan = Electronic version
edition = 1 photograph : sepia ; 11 x 13 cm
publisher = L. Tom Perry Special Collections, Harold B. Lee Library, Brigham Young University
physicalDescription = Photographs
scale = William Gates papers
extentField = http://findingaid.lib.byu.edu/viewItem/MSS%20279/Series%2011/Subseries%205/Item%20979/box%20128/folder%2012
medium = William Gates photograph with Emiliano Zapata; MSS 279; William Gates papers; L. Tom Perry Special Collections; 20th Century Western & Mormon Manuscripts; 1130 Harold B. Lee Library; Brigham Young University; Provo, Utah 84602; http://sc.lib.byu.edu/
dimensions = MSS 279 Series 11 Subseries 5 Item 979 box 128 folder 12
arrangement = 
degree = 
contributing = 
names = 
topics = 
geoPlaceNames = 
genre = 
occupations = 
functions = 
subject = 
langIN = 
audience = 
condition = 
generalNotes = 
collection = 
linkToFindingAid =  
source = 
SIRSI = 
callNumber = 

在此示例中,altTitle和description等字段应为空白并跳过。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您已经以优雅的方式解决了字段中的空格问题。不幸的是,operator>>将跳过连续的标签,就像它们是一个单独的分隔符一样。那么,再见空旷的田野?

一种简单的方法是使用getline()来读取单个字符串字段:

getline (ss, coTitle, '\t'); 
getline (ss, altTitle, '\t'); 
getline (ss, description, '\t');
...

另一种方式是