在c中获取文件中每一行的值
get the values for each line in the file in c
我需要阅读这个 main.txt 文件:
STUDENT ID 126345
TEACHER MATH CLASS 122
我需要从这个文件中获取每个值。如果这个 main.txt 文件是这样的:
STUDENT ID 126345
TEACHER ID 3654432
我可以这样做:
#include <stdio.h>
int main(){
FILE *ptr_file;
int id;
char string1[100],string2[100];
ptr_file = fopen("main.txt","r");
while(fscanf(ptr_file,"%s %s %d",string1,string2,id) != EOF){
}
}
但我不能使用 fscanf()
函数,因为 space 这些值之间的数量对于每行来说是不相等的。我怎样才能像这段代码一样逐行获取每个值?
如果每行有 3 个值,由空格(或制表符)分隔,则
fscanf(ptr_file,"%s %s %d",string1,string2,&id);
可以(请注意我使用 &id
而不是 id
),因为 %s
匹配一系列 non-white-space 字符,所以它
不管值之间有多少空格,%s
都会消耗
空白区域:
#include <stdio.h>
int main(void)
{
const char *v = "STUDENT \t ID \t 126345";
int id;
char string1[100],string2[100];
sscanf(v, "%s %s %d", string1, string2, &id);
printf("'%s' '%s' %d\n", string1, string2, id);
return 0;
}
打印
$ ./a
'STUDENT' 'ID' 126345
一般来说,最可靠的解决方案是使用 fgets
逐行阅读
并使用 sscanf
解析该行,因为您可以更好地控制该行何时具有
格式错误:
char buffer[1024];
while(fgets(buffer, sizeof buffer, stdin))
{
int id;
char string1[100],string2[100];
if(sscanf(buffer, "%99s %99s %d", string1, string2, &id) != 3)
{
fprintf(stderr, "Line with wrong format\n");
break;
}
// do something with read values
}
编辑
用户指出该行可能有 3 或 4 个值,那么您
可以这样做:
char buffer[1024];
while(fgets(buffer, sizeof buffer, stdin))
{
int id;
char string1[100],string2[100],string3[100];
res = sscanf(buffer, "%99s %99s %99s %d", string1, string2, string3, &id);
if(res != 4)
{
int res = sscanf(buffer, "%99s %99s %d", string1, string2, &id);
if(res != 3)
{
fprintf(stderr, "Line with wrong format, 3 or 4 values expected\n");
break;
}
}
if(res == 3)
printf("'%s' '%s' %d\n", string1, string2, id);
else
printf("'%s' '%s' '%s' %d\n", string1, string2, string3, id);
}
我需要阅读这个 main.txt 文件:
STUDENT ID 126345
TEACHER MATH CLASS 122
我需要从这个文件中获取每个值。如果这个 main.txt 文件是这样的:
STUDENT ID 126345
TEACHER ID 3654432
我可以这样做:
#include <stdio.h>
int main(){
FILE *ptr_file;
int id;
char string1[100],string2[100];
ptr_file = fopen("main.txt","r");
while(fscanf(ptr_file,"%s %s %d",string1,string2,id) != EOF){
}
}
但我不能使用 fscanf()
函数,因为 space 这些值之间的数量对于每行来说是不相等的。我怎样才能像这段代码一样逐行获取每个值?
如果每行有 3 个值,由空格(或制表符)分隔,则
fscanf(ptr_file,"%s %s %d",string1,string2,&id);
可以(请注意我使用 &id
而不是 id
),因为 %s
匹配一系列 non-white-space 字符,所以它
不管值之间有多少空格,%s
都会消耗
空白区域:
#include <stdio.h>
int main(void)
{
const char *v = "STUDENT \t ID \t 126345";
int id;
char string1[100],string2[100];
sscanf(v, "%s %s %d", string1, string2, &id);
printf("'%s' '%s' %d\n", string1, string2, id);
return 0;
}
打印
$ ./a
'STUDENT' 'ID' 126345
一般来说,最可靠的解决方案是使用 fgets
逐行阅读
并使用 sscanf
解析该行,因为您可以更好地控制该行何时具有
格式错误:
char buffer[1024];
while(fgets(buffer, sizeof buffer, stdin))
{
int id;
char string1[100],string2[100];
if(sscanf(buffer, "%99s %99s %d", string1, string2, &id) != 3)
{
fprintf(stderr, "Line with wrong format\n");
break;
}
// do something with read values
}
编辑
用户
char buffer[1024];
while(fgets(buffer, sizeof buffer, stdin))
{
int id;
char string1[100],string2[100],string3[100];
res = sscanf(buffer, "%99s %99s %99s %d", string1, string2, string3, &id);
if(res != 4)
{
int res = sscanf(buffer, "%99s %99s %d", string1, string2, &id);
if(res != 3)
{
fprintf(stderr, "Line with wrong format, 3 or 4 values expected\n");
break;
}
}
if(res == 3)
printf("'%s' '%s' %d\n", string1, string2, id);
else
printf("'%s' '%s' '%s' %d\n", string1, string2, string3, id);
}