我有一个csv文件,如下所示:
private readony IOverlayViewModel _overlayViewModel;
public ICommand UpdateCountCommand { get; set; }
ctor(IOverlayViewModel overlayViewModel)
{
_overlayViewModel = overlayViewModel;
UpdatedCountCommand = new MyICommandImplementation(UpdatedCountCommand_Executed);
}
private void UpdatedCountCommand_Executed(/* Add correct method signature */)
{
// If needed, retrieve data from parameter...
// Update overlay ViewModel text
_overlayViewModel.Text = ""; // Whichever text was calculated before
}
我要实现的功能是find_name,它应该遍历每个记录的第一个字段并将其与正在搜索的名称进行比较。
我尝试了fgets,fscanf,但是代码不起作用或出现分段错误。
这是我到目前为止所拥有的:
Jake, 25, Montreal
Maria, 32, London
Alex, 19, New York
Jake, 22, Dubai
感谢您的帮助。
编辑:我不想使用任何标记器功能,我想了解如何使用fscanf。
答案 0 :(得分:0)
如果您一次阅读一个字段,那么处理一行的结尾将变得非常棘手,因此建议您一次将其作为一行,例如:
int FieldScanCount = 0;
char city[1000];
int age = 0;
while ((FieldScanCount = fscanf(csvFile, "%1000[A-Za-z0-9 ],%i,%1000[A-Za-z0-9 ]\r\n", &word, &age, &city)) > 0) {
我假设每行的末尾都有一个\ r \ n,但是根据您的文件,这可能只需要\ n。
答案 1 :(得分:0)
关于:
while ( !feof(csvFile) ) {
fscanf(csvFile, "%s%*[^,]", word);
if ( strcmp(word, name) == 0 )
printf("name found");
}
建议使用:
while ( fgets( word, sizeof(word), csvFile ) )
{
char *token = strtok( word, ", " );
if( strcmp( token, name ) == 0 )
{
printf("name found");
}
}
但是,如果您不想使用strtok()
,则建议:
while ( fgets( word, sizeof word, csvFile ) )
{
char *comma = strchr( word, ',');
*comma = \0';
if( strcmp( word, name ) == 0 )
{
printf("name found");
}
}
但是,如果您真的想使用scanf()
系列功能:
while ( fgets( word, sizeof word, csvFile ) )
{
char possibleMatch[1000];
if( sscanf( "%999[^,]", word, possibleMatch ) == 1 )
{
if( strcmp( possibleMatch, name ) == 0 )
{
printf("name found");
}
}
}
但是,如果您确实要使用fscanf()
:
while ( fscanf( csvFile, "%999[^,]", word ) == 1 )
{
if( strcmp( word, name ) == 0 )
{
printf("name found");
}
//consume rest of input file line
int ch;
while( ( ch = getchar() ) != EOF && ch != '\n' ){;}
}
甚至更好:
while ( fscanf( csvFile, " %999[^,] %*[^\n]", word ) == 1 )
{
if( strcmp( word, name ) == 0 )
{
printf("name found");
}
}