use*_*696 13 c gcc scanf format-specifiers
我正在尝试使用fscanf读取数据,'e'例如,输入的一部分是一个浮点数后跟字母41.72elapsed.在编写strng时fscanf,我尝试使用"%felapsed",但这不起作用,就像%fe它自己的格式说明符一样.我怎么用这个来读fscanf?
编辑:这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define CHAR_MAX 1024
int main(int argc, char **argv)
{
FILE *file_in = fopen(argv[1], "r+");
char out_name[CHAR_MAX];
strcpy(out_name, argv[1]);
strcat(out_name, ".csv");
FILE *csv_out = fopen(out_name, "w");
int minutes;
float seconds;
fprintf(csv_out, "Trial #, Execution Time\n");
for (int i = 0; fscanf(file_in, "%*fuser %*fsystem %d:%felapsed %*d%%CPU (%*davgtest+%*davgdata %*dmaxresident)k\n%*dinputs+%*doutputs (%*dmajor+%*dminor)pagefaults %*dswaps\n", &minutes, &seconds) == 2; i++) {
fprintf(csv_out, "%d, %d:%.2f\n", i, minutes, seconds);
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以下是一些示例输入:
283.97user 0.69system 1:13.77elapsed 385%CPU (0avgtext+0avgdata 107472maxresident)k
0inputs+4616outputs (0major+9550minor)pagefaults 0swaps
287.87user 0.35system 1:14.41elapsed 387%CPU (0avgtext+0avgdata 107328maxresident)k
0inputs+4616outputs (0major+9524minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)
这是一个问题 scanf()
FP格式就像"%f"看到e引入取幂一样.由于e后面没有数字,扫描float停止.但是scanf()已经准备好扫描了一个e并且C不需要scanf()能够备份超过1个字符.因此使用简单的代码就是运气不佳"%f".
某些系统将备份超过1个字符,但C不需要该功能.
代码需要一种新方法 - 以秒为单位扫描字符串
char sec[20];
int cnt = fscanf(file_in, "%d:%19[0-9. ]elapsed", &minutes, sec);
if (cnt == 2) {
seconds = atof(sec);
...
}
Run Code Online (Sandbox Code Playgroud)
根本不需要"elapsed"您的格式。该函数scanf族将从输入中读取尽可能长的内容,对于浮点数,当遇到非数字字符(即 in )时,它将停止e读取elapsed。
所以格式只需要是"%f",仅此而已。IE
float value;
fscanf(file, "%f", &value);
Run Code Online (Sandbox Code Playgroud)
如果您想读取并丢弃该elapsed部分,请使用"%*s",星号告诉scanf(和系列)读取并忽略其余部分,因此完整的调用看起来像
float value;
fscanf(file, "%f%*s", &value);
Run Code Online (Sandbox Code Playgroud)
看到你的代码后,使用类似的东西可以变得更加简单和容易
char input[512];
for (int i = 0; fgets(input, sizeof input, file_in) != NULL; ++i) {
if (sscanf(input, "%*f%*s %*f%*s %d:%f%*s", &minutes, &seconds) == 2) {
fprintf(csv_out, "%d, %d:%.2f\n", i, minutes, seconds);
}
}
Run Code Online (Sandbox Code Playgroud)
由于此循环使用fgets而不是直接循环,因此fscanf您将读取输入文件中的所有行,而不仅仅是第一行。另外,由于fgets使用了 ,我们不需要该sscanf函数来实际解析我们不需要的字符串部分(这是其中的大部分),而是我们只解析sscanf输入字符串,直到获得我们需要的数据。