stdio.h fscanf格式说明符
我有一个文件,它要么包含两个数字,中间有可变的空格,要么只包含一个空行。我需要知道什么时候输入只是一个空行,然后不使用fscanf分配给这些变量 做:stdio.h fscanf格式说明符,c,file-io,stdio,C,File Io,Stdio,我有一个文件,它要么包含两个数字,中间有可变的空格,要么只包含一个空行。我需要知道什么时候输入只是一个空行,然后不使用fscanf分配给这些变量 做: FILE *pFile = fopen (my_file, "r"); if (pFile == NULL) perror ("Error opening file"); int succ = 1, num1 = 0, num2 = 0; while (succ != EOF) { succ = fscanf(pFile, "%d %d
FILE *pFile = fopen (my_file, "r");
if (pFile == NULL) perror ("Error opening file");
int succ = 1, num1 = 0, num2 = 0;
while (succ != EOF)
{
succ = fscanf(pFile, "%d %d", &num1, &num2);
}
可以很好地检测所有数字,但不能检测换行符。
我试过:
fscanf(pFile, "%d %d %*[^\n]", &num1, &num2);
但它总是正确地分配给这两个数字。我希望能够创建一个switch语句,根据succ是2(表示两个数字都已分配)还是0(表示空行)来执行其他逻辑
如果可能的话,我宁愿避免使用getline;似乎将iostream与stdio函数混合使用是低效的
我试过了,但没有成功,虽然从逻辑上说我认为它会成功,但没有成功
老实说,我甚至不明白为什么会有这样的事情
"%d %d \n"
不起作用。很简单。。。扫描文件直到换行,返回完成了多少作业,就这样 %d%d\n“
无法实现操作目标,因为任何空格指令都会占用任何空格。使用'
或'\n'
没有区别,它们都使用0个或更多的空格。(除了在“[]”
说明符中)
OP想要检测'\n'
,而fscanf()
不是一个好的选择fgets()
更好
#define N (100 /* longest line */)
char buf[N];
while (fgets(buf, sizeof buf, pFile) != NULL) {
int cnt = sscanf("%d%d",&num1, &num2);
switch (cnt) {
case 0: Handle_NoNumbers(); break;
case 1: Handle_1Number(); break;
case 2: Handle_Success(); break;
}
}
fscanf(stream,'%d',&num)
中的'%d'
指定使用数字前的所有前导空格,而不考虑'\n'
或'
等
如果代码必须使用fscanf()
// Consume white space except \n and EOF
int consume_ws(FILE *pFile) {
do {
int c = fgetc(pFile); // could use fscanf(...%c...) here
if (c == '\n' || c == EOF) return c;
} while (isspace(c));
ungetc(c, pFile); // put the char back
return 0;
}
...
while(1) {
int num[2];
int i;
for (i = 0; i < 2; i++) {
if (consume_ws(pFile)) {
Handle_ScantData(); // Not enough data
return;
}
if (1 != fscanf(pFile, "%d", &num[i]) {
Handle_NonnumericData();
return;
}
}
int ch = consume_ws(pFile);
if (ch == 0) Handle_ExtraData();
// Else do something with the 2 numbers
if (ch == EOF) return;
}
//使用除\n和EOF之外的空白
int consumer_ws(文件*pFile){
做{
int c=fgetc(pFile);//此处可以使用fscanf(…%c…)
如果(c='\n'| c==EOF)返回c;
}while(isspace(c));
ungetc(c,pFile);//将字符放回原处
返回0;
}
...
而(1){
int-num[2];
int i;
对于(i=0;i<2;i++){
如果(消耗_ws(pFile)){
Handle_ScantData();//数据不足
返回;
}
如果(1!=fscanf(pFile、%d、&num[i]){
Handle_NonnumericData();
返回;
}
}
int ch=消耗量(pFile);
if(ch==0)Handle_ExtraData();
//否则就用这两个数字做点什么
如果(ch==EOF)返回;
}
在C中,我建议使用<代码> fgsSd()/<代码>!然后<代码> sChanff()/<代码>或更详细的解析。不知道C++。我不知道行会用多长时间,这是第二个参数所需要的,我只是需要所有到NeXLead的,也可以使用<代码> GETCHARE()。
重复。这可能是您最好的选择。根据以下答案:,在格式说明符的末尾添加一个空格,“%d%d”@ ToMasMatthWS——一个很好的想法,但在实践中它根本不会改变程序的行为;因为我不去检测空白行。这会占用剩余的行,空行,然后恢复。