无法弄清楚如何隔离号码并替换它
Can't figure out how to isolate number and replace it
我所做的是使用第一组代码提取数据并将其放入新文件中,因此它只是值
这是我的第一组代码的输入文件:
original input
这是我的第二组代码的输入文件,这是我的主要问题:
second set of input code
然后在第二组代码中读取新文件,因此它使用 fgetc 输出数字,我现在如何使用它应用一个简单的公式?
具体来说,该公式会将任何 10 值转换为 0 值
我试过了,因为 fgetc 是无符号字符,所以我尝试在 if 语句
中使用二进制数 10
到目前为止,这是我的代码:
#include<stdio.h>
int main()
{
FILE* ptr = fopen("Data.txt","r");
if (ptr==NULL)
{
printf("no such file.");
return 0;
}
FILE*fp = fopen("/data flow/NEWdata.txt", "w+");
int x;
int count=0;
char buf[100];
fscanf(ptr,"%*s %*s %*s %*s %*s %*s %*s %s ",buf); //skip first line and stuff before first value(column names)
while (fscanf(ptr,"%*s %*s %*s %*s %s ",buf)==1)
{
fprintf(fp, "%s\n",buf);
}
fclose(fp);
return 0;
}
第二组代码
#include <stdio.h>
#include <stdlib.h>
int main () {
FILE *fp;
char str[100];
/* opening file for reading */
fp = fopen("NEWdata.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
int i;
while( fgets (str, 100, fp)!=NULL ) {
/* writing content to stdout */
sscanf (str,%u,i);
printf(%u,i);
}
fclose(fp);
return(0);
}
我所谓的命令行
enter image description here
我得到的错误如下
enter image description here
if (measure = 10)
fprintf (ofp, "%f\n", measure - 10);
else
fprintf (ofp, "%f\n", measure);
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp, *ofp; /* file pointer, output file pointer */
if (argc < 3 ) { /* validate 2 arguments given for in/out filenames */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename outfilename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen ("Data.txt", "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if ((ofp = fopen ("NEWdata.txt", "w")) == NULL) {
perror ("fopen-argv[2]");
return 1;
}
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (measure = 10)
fprintf (ofp, "%f\n", measure - 10);
else
fprintf (ofp, "%f\n", measure);
n++; /* increment line counter */
}
}
如果我理解正确,你想从 Data.txt
读取值,如果 Measurement
的值是 10
,你想将值设置为 0
.如我的评论所述,您的 Measurement
值是一个 浮点数 数字(下面使用 double
)。由于无法以 floating-point 格式准确表示所有数字,因此浮点数的比较本质上是不准确的。 (10.0
可以准确表示,但要注意限制)。参见 Is floating point math broken? and Why Are Floating Point Numbers Inaccurate?
在到达那里之前,避免硬编码文件名 或在您的代码中使用幻数。 main()
采用允许您将信息传递给代码的参数。您可以简单地将要读取的文件名作为第一个参数传递给您的程序,或者将文件名作为输入。例如
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp; /* file pointer */
if (argc < 2 ) { /* validate 1 argument given for filename */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
使用 fgets()
和缓冲区(例如 MAXC
的字符数组,最大字符数),您可以读取并丢弃第一行。 (*不要忘记验证读取):
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
现在只需将带有 fgets()
的每个后续行循环读取到同一个缓冲区中,然后将该缓冲区传递给 sscanf()
以从该行解析您需要的值,例如
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
(注意: 如果行的格式不好,您的读取不会像使用 fscanf()
那样失败。这里通过使用 [=30= 读取]],无论格式如何,您一次使用一行,然后使用 sscanf()
解析该行的值。如果行格式与您的 format-string, 你只需丢弃该行并阅读下一行。)
现在您可以使用分隔成 date, time, prod, measure & unit
的值做任何您喜欢的事情。在这里我们将简单地比较 measure
看它是否是 10.0
或更大直到 11.0
(不包含),并从值中减去 10.0
使值 0.xxx
它在 10.xxx
的位置。你可以简单地输出 0.0
如果你喜欢(由你决定)
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (10.0 <= measure && measure < 11.0)
printf ("measurement[%2zu]: %.3f (was %.3f)\n",
n, measure - 10., measure);
else
printf ("measurement[%2zu]: %.3f\n", n, measure);
n++; /* increment line counter */
}
}
这就是您想要的最简单的示例。 (1) 使用 fgets()
读取和 (2) 使用 sscanf()
解析的基础知识可以涵盖各种输入情况。你会一遍又一遍地使用它。这样做而不是直接使用 fscanf()
的原因是为了防止单行的格式错误导致 匹配失败 ,其中从输入流中提取的字符停止离开输入流中的冒犯字符未读,等着你下次尝试输入时再次咬你。
完整的例子是:
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp; /* file pointer */
if (argc < 2 ) { /* validate 1 argument given for filename */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (10.0 <= measure && measure < 11.0)
printf ("measurement[%2zu]: %.3f (was %.3f)\n",
n, measure - 10., measure);
else
printf ("measurement[%2zu]: %.3f\n", n, measure);
n++; /* increment line counter */
}
}
示例输入文件
$ cat dat/data_timestamp.txt
TimeDateStamp Product Measurement Unit
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 1.991 SLPM
2019-11-09 16:54 FS2012 1.991 SLPM
2019-11-09 16:54 FS2012 1.991 SLPM
2019-11-09 16:54 FS2012 10.0 SLPM
2019-11-09 16:54 FS2012 10.661 SLPM
2019-11-09 16:54 FS2012 10.991 SLPM
2019-11-09 16:54 FS2012 11.0 SLPM
示例Use/Output
下面,我展示了 10
减少到 0
的地方:
$ ./bin/read_data_timestamp dat/data_timestamp.txt
measurement[ 0]: 0.344
measurement[ 1]: 0.344
measurement[ 2]: 0.344
measurement[ 3]: 0.344
measurement[ 4]: 0.136
measurement[ 5]: 0.136
measurement[ 6]: 0.136
measurement[ 7]: 0.136
measurement[ 8]: 0.047
measurement[ 9]: 0.047
measurement[10]: 0.047
measurement[11]: 0.047
measurement[12]: 1.991
measurement[13]: 1.991
measurement[14]: 1.991
measurement[15]: 0.000 (was 10.000)
measurement[16]: 0.661 (was 10.661)
measurement[17]: 0.991 (was 10.991)
measurement[18]: 11.000
检查一下,让我知道这是否接近您的需要。我可能仍然误解了你试图通过 10
到 0
实现的目标,但如果我误解了,请在下面发表评论,我很乐意进一步提供帮助。
写入输出文件作为程序的第二个参数
要将调整后的 Measurement
值单独写入您选择的输出文件,您只需在命令行输入文件名后提供要使用的输出文件名,然后打开文件进行输出使用 argv[2]
(main()
的第二个命令行参数)变化很小。只需添加另一个 FILE*
指针 ofp
(用于 输出文件指针 ),然后打开该文件进行写入:
FILE *fp, *ofp; /* file pointer, output file pointer */
if (argc < 3 ) { /* validate 2 arguments given for in/out filenames */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename outfilename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if ((ofp = fopen (argv[2], "w")) == NULL) {
perror ("fopen-argv[2]");
return 1;
}
然后使用fprintf
输出调整后的测量值,例如
if (10.0 <= measure && measure < 11.0)
fprintf (ofp, "%.3f\n", measure - 10.);
else
fprintf (ofp, "%.3f\n", measure);
(其余程序完全相同)
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp, *ofp; /* file pointer, output file pointer */
if (argc < 3 ) { /* validate 2 arguments given for in/out filenames */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename outfilename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if ((ofp = fopen (argv[2], "w")) == NULL) {
perror ("fopen-argv[2]");
return 1;
}
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (10.0 <= measure && measure < 11.0)
fprintf (ofp, "%.3f\n", measure - 10.);
else
fprintf (ofp, "%.3f\n", measure);
n++; /* increment line counter */
}
}
如果我随后使用两个参数(例如输入和输出文件名)调用我的程序,如下所示:
$ ./bin/read_data_timestamp2 dat/data_timestamp.txt dat/measure_val.txt
我将从我的输入文件 dat/data_timestamp.txt
中读取并将结果写入我的输出文件 dat/measure_val.txt
(您可以为输出文件使用您喜欢的任何文件名,但您的输入将是 Data.txt
).
生成的输出文件
$ cat dat/measure_val.txt
0.344
0.344
0.344
0.344
0.136
0.136
0.136
0.136
0.047
0.047
0.047
0.047
1.991
1.991
1.991
0.000
0.661
0.991
11.000
让我知道是否解决了问题。
我所做的是使用第一组代码提取数据并将其放入新文件中,因此它只是值
这是我的第一组代码的输入文件:
original input
这是我的第二组代码的输入文件,这是我的主要问题:
second set of input code
然后在第二组代码中读取新文件,因此它使用 fgetc 输出数字,我现在如何使用它应用一个简单的公式? 具体来说,该公式会将任何 10 值转换为 0 值 我试过了,因为 fgetc 是无符号字符,所以我尝试在 if 语句
中使用二进制数 10到目前为止,这是我的代码:
#include<stdio.h>
int main()
{
FILE* ptr = fopen("Data.txt","r");
if (ptr==NULL)
{
printf("no such file.");
return 0;
}
FILE*fp = fopen("/data flow/NEWdata.txt", "w+");
int x;
int count=0;
char buf[100];
fscanf(ptr,"%*s %*s %*s %*s %*s %*s %*s %s ",buf); //skip first line and stuff before first value(column names)
while (fscanf(ptr,"%*s %*s %*s %*s %s ",buf)==1)
{
fprintf(fp, "%s\n",buf);
}
fclose(fp);
return 0;
}
第二组代码
#include <stdio.h>
#include <stdlib.h>
int main () {
FILE *fp;
char str[100];
/* opening file for reading */
fp = fopen("NEWdata.txt" , "r");
if(fp == NULL) {
perror("Error opening file");
return(-1);
}
int i;
while( fgets (str, 100, fp)!=NULL ) {
/* writing content to stdout */
sscanf (str,%u,i);
printf(%u,i);
}
fclose(fp);
return(0);
}
我所谓的命令行 enter image description here
我得到的错误如下 enter image description here
if (measure = 10)
fprintf (ofp, "%f\n", measure - 10);
else
fprintf (ofp, "%f\n", measure);
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp, *ofp; /* file pointer, output file pointer */
if (argc < 3 ) { /* validate 2 arguments given for in/out filenames */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename outfilename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen ("Data.txt", "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if ((ofp = fopen ("NEWdata.txt", "w")) == NULL) {
perror ("fopen-argv[2]");
return 1;
}
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (measure = 10)
fprintf (ofp, "%f\n", measure - 10);
else
fprintf (ofp, "%f\n", measure);
n++; /* increment line counter */
}
}
如果我理解正确,你想从 Data.txt
读取值,如果 Measurement
的值是 10
,你想将值设置为 0
.如我的评论所述,您的 Measurement
值是一个 浮点数 数字(下面使用 double
)。由于无法以 floating-point 格式准确表示所有数字,因此浮点数的比较本质上是不准确的。 (10.0
可以准确表示,但要注意限制)。参见 Is floating point math broken? and Why Are Floating Point Numbers Inaccurate?
在到达那里之前,避免硬编码文件名 或在您的代码中使用幻数。 main()
采用允许您将信息传递给代码的参数。您可以简单地将要读取的文件名作为第一个参数传递给您的程序,或者将文件名作为输入。例如
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp; /* file pointer */
if (argc < 2 ) { /* validate 1 argument given for filename */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
使用 fgets()
和缓冲区(例如 MAXC
的字符数组,最大字符数),您可以读取并丢弃第一行。 (*不要忘记验证读取):
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
现在只需将带有 fgets()
的每个后续行循环读取到同一个缓冲区中,然后将该缓冲区传递给 sscanf()
以从该行解析您需要的值,例如
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
(注意: 如果行的格式不好,您的读取不会像使用 fscanf()
那样失败。这里通过使用 [=30= 读取]],无论格式如何,您一次使用一行,然后使用 sscanf()
解析该行的值。如果行格式与您的 format-string, 你只需丢弃该行并阅读下一行。)
现在您可以使用分隔成 date, time, prod, measure & unit
的值做任何您喜欢的事情。在这里我们将简单地比较 measure
看它是否是 10.0
或更大直到 11.0
(不包含),并从值中减去 10.0
使值 0.xxx
它在 10.xxx
的位置。你可以简单地输出 0.0
如果你喜欢(由你决定)
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (10.0 <= measure && measure < 11.0)
printf ("measurement[%2zu]: %.3f (was %.3f)\n",
n, measure - 10., measure);
else
printf ("measurement[%2zu]: %.3f\n", n, measure);
n++; /* increment line counter */
}
}
这就是您想要的最简单的示例。 (1) 使用 fgets()
读取和 (2) 使用 sscanf()
解析的基础知识可以涵盖各种输入情况。你会一遍又一遍地使用它。这样做而不是直接使用 fscanf()
的原因是为了防止单行的格式错误导致 匹配失败 ,其中从输入流中提取的字符停止离开输入流中的冒犯字符未读,等着你下次尝试输入时再次咬你。
完整的例子是:
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp; /* file pointer */
if (argc < 2 ) { /* validate 1 argument given for filename */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (10.0 <= measure && measure < 11.0)
printf ("measurement[%2zu]: %.3f (was %.3f)\n",
n, measure - 10., measure);
else
printf ("measurement[%2zu]: %.3f\n", n, measure);
n++; /* increment line counter */
}
}
示例输入文件
$ cat dat/data_timestamp.txt
TimeDateStamp Product Measurement Unit
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.344 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.136 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 0.047 SLPM
2019-11-09 16:54 FS2012 1.991 SLPM
2019-11-09 16:54 FS2012 1.991 SLPM
2019-11-09 16:54 FS2012 1.991 SLPM
2019-11-09 16:54 FS2012 10.0 SLPM
2019-11-09 16:54 FS2012 10.661 SLPM
2019-11-09 16:54 FS2012 10.991 SLPM
2019-11-09 16:54 FS2012 11.0 SLPM
示例Use/Output
下面,我展示了 10
减少到 0
的地方:
$ ./bin/read_data_timestamp dat/data_timestamp.txt
measurement[ 0]: 0.344
measurement[ 1]: 0.344
measurement[ 2]: 0.344
measurement[ 3]: 0.344
measurement[ 4]: 0.136
measurement[ 5]: 0.136
measurement[ 6]: 0.136
measurement[ 7]: 0.136
measurement[ 8]: 0.047
measurement[ 9]: 0.047
measurement[10]: 0.047
measurement[11]: 0.047
measurement[12]: 1.991
measurement[13]: 1.991
measurement[14]: 1.991
measurement[15]: 0.000 (was 10.000)
measurement[16]: 0.661 (was 10.661)
measurement[17]: 0.991 (was 10.991)
measurement[18]: 11.000
检查一下,让我知道这是否接近您的需要。我可能仍然误解了你试图通过 10
到 0
实现的目标,但如果我误解了,请在下面发表评论,我很乐意进一步提供帮助。
写入输出文件作为程序的第二个参数
要将调整后的 Measurement
值单独写入您选择的输出文件,您只需在命令行输入文件名后提供要使用的输出文件名,然后打开文件进行输出使用 argv[2]
(main()
的第二个命令行参数)变化很小。只需添加另一个 FILE*
指针 ofp
(用于 输出文件指针 ),然后打开该文件进行写入:
FILE *fp, *ofp; /* file pointer, output file pointer */
if (argc < 3 ) { /* validate 2 arguments given for in/out filenames */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename outfilename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if ((ofp = fopen (argv[2], "w")) == NULL) {
perror ("fopen-argv[2]");
return 1;
}
然后使用fprintf
输出调整后的测量值,例如
if (10.0 <= measure && measure < 11.0)
fprintf (ofp, "%.3f\n", measure - 10.);
else
fprintf (ofp, "%.3f\n", measure);
(其余程序完全相同)
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXF 32
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read from file */
size_t n = 0; /* line counter */
FILE *fp, *ofp; /* file pointer, output file pointer */
if (argc < 3 ) { /* validate 2 arguments given for in/out filenames */
fprintf (stderr, "error: insufficient input,\n"
"usage: %s filename outfilename\n", argv[0]);
return 1;
}
/* open file/validate file open for reading */
if ((fp = fopen (argv[1], "r")) == NULL) {
perror ("fopen-argv[1]");
return 1;
}
if ((ofp = fopen (argv[2], "w")) == NULL) {
perror ("fopen-argv[2]");
return 1;
}
if (!fgets (buf, MAXC, fp)) { /* read/discard 1st line */
fputs ("error: EOF on read of first line.\n", stderr);
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read all remaining lines */
char date[MAXF], time[MAXF], prod[MAXF], unit[MAXF];
double measure;
if (sscanf (buf, "%s %s %s %lf %s", /* validate all 5 fields */
date, time, prod, &measure, unit) != 5) {
fprintf (stderr, "error: invalid format, line: %zu\n", n + 1);
continue;
}
/* do whatever you need with the separated values.
* if measure is 10.xx, then make measure 0.xx
*/
if (10.0 <= measure && measure < 11.0)
fprintf (ofp, "%.3f\n", measure - 10.);
else
fprintf (ofp, "%.3f\n", measure);
n++; /* increment line counter */
}
}
如果我随后使用两个参数(例如输入和输出文件名)调用我的程序,如下所示:
$ ./bin/read_data_timestamp2 dat/data_timestamp.txt dat/measure_val.txt
我将从我的输入文件 dat/data_timestamp.txt
中读取并将结果写入我的输出文件 dat/measure_val.txt
(您可以为输出文件使用您喜欢的任何文件名,但您的输入将是 Data.txt
).
生成的输出文件
$ cat dat/measure_val.txt
0.344
0.344
0.344
0.344
0.136
0.136
0.136
0.136
0.047
0.047
0.047
0.047
1.991
1.991
1.991
0.000
0.661
0.991
11.000
让我知道是否解决了问题。