所以我正在为我的班级编写一个程序,我从文本文件中读取了一行,如下所示:
while (fgets(line, sizeof(line), file) != NULL)
从文本文件获取并且我一直在使用匹配字符的行[index]来获取该文本文件中的特定行。
文本文件行如下所示;
dbr:Edmonton rdf:type yago:WikicatTownsInAlberta ,
我一直在使用sscanf从每一行获取特定数据。
sscanf(line,"%s %s %s %s",triple[t][0],triple[t][1],triple[t][2],triple[t][3]);
现在我期望得到的是:
triple[t][0] == dbr:Edmonton
triple[t][1] == rdf:type
triple[t][2] == yago:WikicatTownsInAlberta
triple[t][3] == ,
而不是我的输出:
Object:dbr:rdf:yago,
Predicate:rdf:yago,
Subject:yago,
Extraneous: ,
然而,当我printf(%s,line)时,我得到的文件与文件中的完全一致。
这可能是完全愚蠢的,但我真的希望你能帮助我。
干杯,
整个代码如下:
#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
sqlite3 * db; // THE DATABASE
sqlite3_stmt * stmt; // THE SQL STATEMENT
int main(int argc, char * argv[])
{
// Do Argument Stuff, Open Database
int rc;
char * class;
char * data;
if (argc!=3)
{
printf("Usage: <programfile.c database data>\n");
printf("You specified %d arguments. You need to specify 3.\n",argc);
return 1;
}
else
{
printf("Correct Number of Inputs!\n");
//printf("Argument %d: %s",argc,argv[0]);
//printf("Argument %d: %s",argc,argv[1]);
//printf("Argument %d: %s",argc,argv[2]);
data = argv[2];
printf("Data: %s\n",data);
rc = sqlite3_open(argv[1], &db);
}
// Open File
FILE * file = fopen(data,"r");
if (file == NULL)
{
printf("ERROR: File open error.\n");
return 1;
}
/* Read the file */
char line[256];
char prefix[256][200];
char prefixURI[256][200];
char triple[256][200][4];
// object, predicate, subject
while (fgets(line, sizeof(line), file) != NULL)
{
//printf("%s\n",line);
int p = 0, t=0;
// Handle COMMENTS and Blank Lines
if (line[0] == '#' || line[0] == '\n')
{
continue;
}
// Handle "@prefix"
else if (line[0] == '@')
{
// Load prefix (rdf: into prefix) and the URI into prefixURI.
sscanf(line,"@prefix %s %s",prefix[p],prefixURI[p]);
printf("Prefix Encoded: %s URI: %s\n",prefix[p],prefixURI[p]);
p++;
}
// handle data triples
else if (line[3] == ':')
{
printf("%s",line);
sscanf(line,"%s %s %s %s",triple[t][0],triple[t][1],triple[t] [2],triple[t][3]);
printf("Object:%s \nPredicate:%s \nSubject:%s\nExtraneous: %s\n",triple[t][0],triple[t][1],triple[t][2],triple[t][3]);
}
} // end getWhile Loop
fclose(file);
}
答案 0 :(得分:-1)
如果str是一个包含多行的字符数组,则sscanf按列顺序读取字符。如果(line [3] ==':')condition
,你必须替换你正确的方法是:
// handle data triples
else if (line[3] == ':')
{
printf("%s",line);
sscanf(line,"%s %s %s %s",triple[0][t],triple[1][t],triple[2] [t],triple[3][t]);
printf("Object:%s \nPredicate:%s \nSubject:%s\nExtraneous: %s\n",triple[0][t],triple[1][t],triple[2][t],triple[3][t]);
}