使用 sscanf 读取空间
Reading spaces with sscanf
我正在尝试使用 sscanf
读取字符串,以便在拆分文件时将此扫描的字符串用作文件名。
问题是 sscanf
只读取文件中出现的第一个 space,这是正常情况。但是,我在 Stack Overflow 中看到了很多关于如何读取这些 spaces.
的技巧。
不幸的是,它们似乎都是一样的,只需在函数中添加一个%[^\t\n[=14=]]
或类似的东西即可。
问题是这种方法对我不起作用,我无法确定原因;我尝试了在这里找到的所有技巧,其中 none 有效。
如果有人能帮我找出问题,我将不胜感激。
代码如下:
int TAM_BUFFER = 75;
int filecounter=1, linecounter=1;
int main(int argc, char *argv[]){
char fileoutputname[15];
char buffer[TAM_BUFFER];
char buffer2[15];
char buffer3[15];
FILE *arquivo = fopen("Entrada.txt", "r");
FILE *saida;
sprintf(fileoutputname, "%s.txt", buffer2);
saida = fopen(fileoutputname, "w");
if(arquivo != NULL){
while(fgets(buffer, TAM_BUFFER, arquivo)){
if(linecounter==2){
strncpy(buffer2,buffer,sizeof buffer2 - 1);
buffer2[sizeof buffer2 - 1] = '[=10=]';
}
if (strncmp(buffer,"NEWDAY",strlen("NEWDAY")) == 0){
fclose(saida);
linecounter = 1;
filecounter++;
sscanf(buffer2, "%s", &buffer3);
printf("strlen(%s)=%d\n", buffer3, (int) strlen(buffer3));
sprintf(fileoutputname, "%s.txt", buffer3);
saida = fopen(fileoutputname, "w");
if (!saida)
return 1;
}
fprintf(saida,"%s\n", buffer);
linecounter++;
}
}
fclose(arquivo);
fclose(saida);
return 0;
}
*我想做的是获取文件的第二行并使用前 14 个字符作为文件名。
文件的输入是这个:
TAM 2000-03-07T14:00 22.78 5.50999 2 786 2.8 798 2.8 186 0.0 298 3.2
TAM 2000-03-08T14:01 22.78 5.50999 2 779 1.2 793 1.0 186 0.0 300 1.5
TAM 2000-03-07T14:02 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:03 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:04 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-17T14:05 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:06 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-08T14:09 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:10 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:11 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-09T14:12 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
如果你决定放弃 sscanf()
,你可以用 fgets()
代替..
#include <stdio.h>
int main()
{
char buffer2[200] = "Name with Spaces";
FILE *fp;
fp = fmemopen (buffer2, strlen (buffer2), "r");
char str[200];
if ( fgets(str, 200, fp) != NULL )
{
printf("Scanned Name: %s \n", str );
}
}
基本如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int TAM_BUFFER = 75;
int main(int argc, char *argv[]){
char fileoutputname[15] = {0};
char buffer[TAM_BUFFER];
FILE *arquivo = fopen("Entrada.txt", "r");
FILE *saida;
if(arquivo == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
fscanf(arquivo, "%14c", fileoutputname);//first split file name
saida = fopen(fileoutputname, "w");
rewind(arquivo);
while(fgets(buffer, sizeof buffer, arquivo)){
if(strncmp(buffer,"NEWDAY", 6) == 0){ // strlen("NEWDAY") is 6
long file_pos = ftell(arquivo);//or use fgetpos for large file, save file position
fscanf(arquivo, "%14c", fileoutputname);//next file name
fseek(arquivo, file_pos, SEEK_SET);//or use fsetpos (pair with fgetpos), restore file position
saida = freopen(fileoutputname, "w", saida);//fclose(saida);saida=fopen(fileoutputname, "w");
}
fprintf(saida,"%s", buffer);//No add newline
}
fclose(arquivo);
fclose(saida);
return 0;
}
如评论中所述,您有许多字符串对于您声明的数组来说太长了。具体来说,您的数据文件行长 75
个字符,无法放入 75
个字符缓冲区。进行更改并稍微调整变量名称,您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { BUFL = 20, TAMB = 80 };
int main (int argc, char **argv) {
int fcnt = 1, lcnt = 1;
char buf[TAMB] = "", buf2[BUFL] = "", buf3[BUFL] = "";
char ofn[BUFL] = "";
FILE *ifp = argc > 1 ? fopen (argv[1], "r") : stdin;
FILE *ofp = argc > 2 ? fopen (argv[2], "w") : stdout;
if (!ifp || !ofp) {
fprintf (stderr, "error: file open failed.\n");
return 1;
}
while (fgets (buf, TAMB, ifp)) {
char *p = buf;
for (; *p && *p !='\n'; p++) {} /* remove trailing \n */
if (*p) *p = 0; /* overwrite '\n' with nul-terminator */
if (lcnt == 2) {
strncpy (buf2, buf, BUFL - 1);
buf2[BUFL - 1] = 0;
}
if (strncmp (buf, "NEWDAY", strlen("NEWDAY")) == 0) {
fclose (ofp);
lcnt = 1;
fcnt++;
// sscanf (buf2, "%s", &buf3);
strcpy (buf3, buf2);
printf ("strlen (%s) = %zu\n", buf3, strlen (buf3));
sprintf (ofn, "%s.txt", buf3);
ofp = fopen (ofn, "w");
if (!ofp)
return 1;
}
fprintf (ofp, "%s\n", buf);
lcnt++;
}
if (ifp != stdin) fclose (ifp);
return 0;
}
示例输入文件
$ cat dat/newday.txt
TAM 2000-03-07T14:00 22.78 5.50999 2 786 2.8 798 2.8 186 0.0 298 3.2
TAM 2000-03-08T14:01 22.78 5.50999 2 779 1.2 793 1.0 186 0.0 300 1.5
TAM 2000-03-07T14:02 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:03 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:04 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-17T14:05 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:06 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-08T14:09 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:10 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:11 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-09T14:12 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
示例Use/Output 文件
$ ./bin/readspaces dat/newday.txt dat/newdayout.txt
strlen (TAM 2000-03-08T14:0) = 19
strlen (TAM 2000-03-08T14:0) = 19
$ cat dat/newdayout.txt
TAM 2000-03-07T14:00 22.78 5.50999 2 786 2.8 798 2.8 186 0.0 298 3.2
TAM 2000-03-08T14:01 22.78 5.50999 2 779 1.2 793 1.0 186 0.0 300 1.5
TAM 2000-03-07T14:02 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:03 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:04 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-17T14:05 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:06 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
$ cat TAM\ 2000-03-08T14\:0.txt
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
(注意: 存在额外的行是因为您未能 trim '\n'
阅读并包含在 buf
中 fgets
)
修复换行问题后,您的输出文件为:
$ cat TAM\ 2000-03-08T14\:0.txt
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
查看更改,如果您有任何问题,请告诉我。目前尚不清楚您尝试使用 buffer2/3 大小达到的长度,但您可以调整 BUFL
常量以使其满足您的需求。另请注意,您可以简单地将 buffer2
复制到 buffer3
,不需要 snprintf
语句。
它确实显示 15
间隔为代码的 outputfilename
部分产生了所需的结果。将 BUFL
更改为 15
提供:
$ ./bin/readspaces dat/newday.txt dat/newdayout.txt
strlen (TAM 2000-03-08) = 14
strlen (TAM 2000-03-08) = 14
然后生成输出文件:
$ cat TAM\ 2000-03-08.txt
xt
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
(注意: 但是,输出文件开头的 NEWDAY
的一些未定义行为不是 xt
)
我正在尝试使用 sscanf
读取字符串,以便在拆分文件时将此扫描的字符串用作文件名。
问题是 sscanf
只读取文件中出现的第一个 space,这是正常情况。但是,我在 Stack Overflow 中看到了很多关于如何读取这些 spaces.
不幸的是,它们似乎都是一样的,只需在函数中添加一个%[^\t\n[=14=]]
或类似的东西即可。
问题是这种方法对我不起作用,我无法确定原因;我尝试了在这里找到的所有技巧,其中 none 有效。
如果有人能帮我找出问题,我将不胜感激。
代码如下:
int TAM_BUFFER = 75;
int filecounter=1, linecounter=1;
int main(int argc, char *argv[]){
char fileoutputname[15];
char buffer[TAM_BUFFER];
char buffer2[15];
char buffer3[15];
FILE *arquivo = fopen("Entrada.txt", "r");
FILE *saida;
sprintf(fileoutputname, "%s.txt", buffer2);
saida = fopen(fileoutputname, "w");
if(arquivo != NULL){
while(fgets(buffer, TAM_BUFFER, arquivo)){
if(linecounter==2){
strncpy(buffer2,buffer,sizeof buffer2 - 1);
buffer2[sizeof buffer2 - 1] = '[=10=]';
}
if (strncmp(buffer,"NEWDAY",strlen("NEWDAY")) == 0){
fclose(saida);
linecounter = 1;
filecounter++;
sscanf(buffer2, "%s", &buffer3);
printf("strlen(%s)=%d\n", buffer3, (int) strlen(buffer3));
sprintf(fileoutputname, "%s.txt", buffer3);
saida = fopen(fileoutputname, "w");
if (!saida)
return 1;
}
fprintf(saida,"%s\n", buffer);
linecounter++;
}
}
fclose(arquivo);
fclose(saida);
return 0;
}
*我想做的是获取文件的第二行并使用前 14 个字符作为文件名。
文件的输入是这个:
TAM 2000-03-07T14:00 22.78 5.50999 2 786 2.8 798 2.8 186 0.0 298 3.2
TAM 2000-03-08T14:01 22.78 5.50999 2 779 1.2 793 1.0 186 0.0 300 1.5
TAM 2000-03-07T14:02 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:03 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:04 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-17T14:05 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:06 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-08T14:09 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:10 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:11 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-09T14:12 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
如果你决定放弃 sscanf()
,你可以用 fgets()
代替..
#include <stdio.h>
int main()
{
char buffer2[200] = "Name with Spaces";
FILE *fp;
fp = fmemopen (buffer2, strlen (buffer2), "r");
char str[200];
if ( fgets(str, 200, fp) != NULL )
{
printf("Scanned Name: %s \n", str );
}
}
基本如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int TAM_BUFFER = 75;
int main(int argc, char *argv[]){
char fileoutputname[15] = {0};
char buffer[TAM_BUFFER];
FILE *arquivo = fopen("Entrada.txt", "r");
FILE *saida;
if(arquivo == NULL){
perror("fopen");
exit(EXIT_FAILURE);
}
fscanf(arquivo, "%14c", fileoutputname);//first split file name
saida = fopen(fileoutputname, "w");
rewind(arquivo);
while(fgets(buffer, sizeof buffer, arquivo)){
if(strncmp(buffer,"NEWDAY", 6) == 0){ // strlen("NEWDAY") is 6
long file_pos = ftell(arquivo);//or use fgetpos for large file, save file position
fscanf(arquivo, "%14c", fileoutputname);//next file name
fseek(arquivo, file_pos, SEEK_SET);//or use fsetpos (pair with fgetpos), restore file position
saida = freopen(fileoutputname, "w", saida);//fclose(saida);saida=fopen(fileoutputname, "w");
}
fprintf(saida,"%s", buffer);//No add newline
}
fclose(arquivo);
fclose(saida);
return 0;
}
如评论中所述,您有许多字符串对于您声明的数组来说太长了。具体来说,您的数据文件行长 75
个字符,无法放入 75
个字符缓冲区。进行更改并稍微调整变量名称,您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { BUFL = 20, TAMB = 80 };
int main (int argc, char **argv) {
int fcnt = 1, lcnt = 1;
char buf[TAMB] = "", buf2[BUFL] = "", buf3[BUFL] = "";
char ofn[BUFL] = "";
FILE *ifp = argc > 1 ? fopen (argv[1], "r") : stdin;
FILE *ofp = argc > 2 ? fopen (argv[2], "w") : stdout;
if (!ifp || !ofp) {
fprintf (stderr, "error: file open failed.\n");
return 1;
}
while (fgets (buf, TAMB, ifp)) {
char *p = buf;
for (; *p && *p !='\n'; p++) {} /* remove trailing \n */
if (*p) *p = 0; /* overwrite '\n' with nul-terminator */
if (lcnt == 2) {
strncpy (buf2, buf, BUFL - 1);
buf2[BUFL - 1] = 0;
}
if (strncmp (buf, "NEWDAY", strlen("NEWDAY")) == 0) {
fclose (ofp);
lcnt = 1;
fcnt++;
// sscanf (buf2, "%s", &buf3);
strcpy (buf3, buf2);
printf ("strlen (%s) = %zu\n", buf3, strlen (buf3));
sprintf (ofn, "%s.txt", buf3);
ofp = fopen (ofn, "w");
if (!ofp)
return 1;
}
fprintf (ofp, "%s\n", buf);
lcnt++;
}
if (ifp != stdin) fclose (ifp);
return 0;
}
示例输入文件
$ cat dat/newday.txt
TAM 2000-03-07T14:00 22.78 5.50999 2 786 2.8 798 2.8 186 0.0 298 3.2
TAM 2000-03-08T14:01 22.78 5.50999 2 779 1.2 793 1.0 186 0.0 300 1.5
TAM 2000-03-07T14:02 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:03 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:04 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-17T14:05 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:06 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-08T14:09 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:10 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:11 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-09T14:12 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
示例Use/Output 文件
$ ./bin/readspaces dat/newday.txt dat/newdayout.txt
strlen (TAM 2000-03-08T14:0) = 19
strlen (TAM 2000-03-08T14:0) = 19
$ cat dat/newdayout.txt
TAM 2000-03-07T14:00 22.78 5.50999 2 786 2.8 798 2.8 186 0.0 298 3.2
TAM 2000-03-08T14:01 22.78 5.50999 2 779 1.2 793 1.0 186 0.0 300 1.5
TAM 2000-03-07T14:02 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:03 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:04 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-17T14:05 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-07T14:06 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
$ cat TAM\ 2000-03-08T14\:0.txt
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
(注意: 存在额外的行是因为您未能 trim '\n'
阅读并包含在 buf
中 fgets
)
修复换行问题后,您的输出文件为:
$ cat TAM\ 2000-03-08T14\:0.txt
NEWDAY
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
查看更改,如果您有任何问题,请告诉我。目前尚不清楚您尝试使用 buffer2/3 大小达到的长度,但您可以调整 BUFL
常量以使其满足您的需求。另请注意,您可以简单地将 buffer2
复制到 buffer3
,不需要 snprintf
语句。
它确实显示 15
间隔为代码的 outputfilename
部分产生了所需的结果。将 BUFL
更改为 15
提供:
$ ./bin/readspaces dat/newday.txt dat/newdayout.txt
strlen (TAM 2000-03-08) = 14
strlen (TAM 2000-03-08) = 14
然后生成输出文件:
$ cat TAM\ 2000-03-08.txt
xt
TAM 2000-03-09T14:13 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-31T14:14 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:15 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:16 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:17 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-01T14:18 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
TAM 2000-03-02T14:19 22.78 5.50999 2 773 3.0 788 3.8 186 0.1 300 0.9
(注意: 但是,输出文件开头的 NEWDAY
的一些未定义行为不是 xt
)