2016-04-21 45 views
1

读书,我有一个文本文件,它看起来像:使用与fgets && sscanf的从一个数组

C M 2/1/2015 18280 "2107070770" 
C U 2/1/2015 18300 "2107070770" 

文本文件有多条线路。我试图将 每行存储到一个字符串数组中,然后将每个值 存储到变量中,我想要使用它。 (我开的fopen成功文件)

我存储与下面的方式每行:

char line[50]; 
char *lines[40]; 
char *eof ; 
int i ; 
while((eof = fgets(line, 50, in)) != NULL) 
{ 
    lines[i] = strdup(eof); 
    i++; 
} 

于是,我试图存储每个值转换成变量,用下面的方法:

​​

所以,我可以分别在每一行工作。 我的代码将每行成功存储到数组中,但在添加sscanf函数后,它会停止工作,但不会输出任何内容。 我做错了什么?

+1

'while((eof = fgets(line,50,in))!= NULL)' - >'while(fgets(line,50,in))',并且最后一个参数为'scanf'你不需要传递一个地址,因为'name'已经(或衰减)了一个指针。 –

+0

'i'在这里没有被初始化。默认情况下,自动变量没有被初始化。 – sjsam

+0

七个转换说明符。六个变量。未定义的行为。你完蛋了。 ;-) – DevSolar

回答

3

对于线

C U 2/1/2015 18300 "2107070770" 

2015年后,你错过的整数18300.您必须在格式字符串格式说明,但没有相应的变量来存储它。

手术后,目的地,天,月,年,missing_variable,名通过成功地检查你的文件描述符

//so the right one will be 
// assuming name is a char* 

int my_int = 0; 
for(j = 0; j <= 39 ; j++) 
{ 
    sscanf(lines[j], "%c %c %d/%d/%d %d %s", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ;  

    /*printf("%s\n", lines[j]);*/ 
} 
+0

非常感谢!有没有什么办法可以忽略引号\“? –

+0

你可能需要用自定义函数去掉 – padfoot

0

开始指向文件

if(in==NULL) 
    exit(-1); // Hope this is already in the code. 

变化

int i ; 

int i=0; // automatic variables are not initialized by default 

ISO/IEC 9899:201X 6.7.9-> 10

如果具有自动存储持续时间的对象没有初始化 明确地,它的值是不确定的。

正如有人指出你在sscanf中有一个缺失的变量。如果你想送的age后撕毁整个的东西,说18280 "2107070770"name,你可以不喜欢它:

sscanf(lines[j], "%c %c %d/%d/%d %d %[^\t\n]", 
    &(operation), &(destination), &(day) , &(month) , &(year), 
    &(my_int), name) ; 

而且正如有人所指出的那样name衰变为指针,所以你不需要通过它像&name

+0

非常感谢!!有没有办法忽略引号\”? –

+0

将'%[^ \ t \ n]'更改为'%[^“\ t \ n]'您可以看到我已经添加了一个引号,这被称为扫描集并在开始时使用'^'我们告诉scanf拒绝接受它后面的字符。如果你不使用'^',那么它意味着只能从包含的字符集中读取,例如'[a-zA-Z]'只读取范围 – sjsam

+0

请参阅[在C中的扫描集](http://www.geeksforgeeks.org/scansets-in-c/) – sjsam