2013-12-16 38 views
0

我有看到它的每一行与此功能的txt文件: txt文件是这样阅读一个txt文件中的特定字符串,字符串转换为intç

NOMLOT: 300
0001 :: 16 :: 27 :: 47 :: 68 :: 79 :: 3 :::: 43 :: 53 :: 71 :: 81 :: 17 :: 28 :: 31 :: 59 ::: 85
0002: 15 :: 32 :: 8 :: 74 :: 79 :: 3 :::: 43 :: 53 :: 71 :: 81 :: 17 :: 28 :: 31 :: 59 ::: 85

my get_line function在这里

char *get_line(char *buf, int n, FILE *f, int line) 
{ 
    int i; 
    for (i=0 ;i<line;i++) 
    { 
     if(fgets(buf,n,f) == NULL) 
      return NULL; 
     buf[strlen(buf) - 1 ] = '\0'; 
    } 
    return buf; 
} 

例如,如果我想打印的第一行会看起来像:

char input[60]; 
get_line(input,TAILLE,fichier,ligne); 
printf("1st line: \n"); 
for (i=0;i<60;i++) 
{ 
    printf("%c",input[i]); 
} 

我想要做什么,是只读的300和转换是300到INT和保存,所以有了这个值,我可以循环我的程序,从第二行开始读取所有现有的行。

回答

1
get_line(input,TAILLE,fichier,ligne); 
    printf("1st line: \n"); 
    for (i=0;i<60 && input[i];i++){ 
     printf("%c",input[i]); 
    } 
    int num; 
    if(1==sscanf(input, "NOMLOT:%d", &num)){ 
     printf("\n%d\n", num); 
    } 
+0

谢谢,这工作正常 – Faxsy

1

好的,首先,评论。如果您按顺序读取文件(例如,读取第1行,然后读取第2行,然后读取第3行),您的get_line()函数将会非常低效,因为您必须执行O(n^2)行读取以读取n行。您应该找到一种方法来构建您的程序,以便每次最多读一行。

至于实际问题,您是否熟悉C函数strtokatoi

假设你input缓冲区包含要行(正则表达式"[^:]*:\d+",例如“NOMLOT:300”),你可以做这样的事情:

const char * num_pos = strtok(input, ":"); // get the position of the colon 
if (! num_pos) 
    ; // colon not found, so handle error 
else 
    { 
    int num = atoi(num_pos + 1); // convert the string starting one char past the colon to an integer 
    // do processing now that you have the number... 
    } 
+0

get_line我使用这个功能,因为我需要将每行放在数组上以显示宾果优惠券! – Faxsy

+0

我尝试了你建议@ 0xbe5077ed,但是当我打印这个数字时,它显示我只有0,或者我想要的是300 – Faxsy

+0

这可能是因为你的缓冲区不包含你认为它包含的内容。在调用'strtok(...)'之前,使用调试器来检查'input'的内容。如果它包含'“NOMLOT:300”',那么在调用'atoi(...)'之前,使用调试器检查'num_pos'的值。如果'atoi(...)'遇到除有效整数以外的任何东西,它将返回零。 – 0xbe5077ed

相关问题