【发布时间】:2016-08-19 17:41:13
【问题描述】:
我正在尝试使用sscanf 读取一个字符串,以便在拆分文件时将此扫描的字符串用作文件名。
问题是sscanf 只读取到文件中出现的第一个空间,这通常会发生。但是,我在 Stack Overflow 中看到了许多关于如何让它读取这些空间的提示。
不幸的是,它们似乎都是同一个东西,只需在函数中添加一个%[^\t\n\0] 或类似的东西。
问题是这种方法对我不起作用,我无法确定原因;我尝试了在这里找到的所有提示,但没有一个有效。
如果有人可以帮助我确定问题,我将不胜感激。
代码如下:
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] = '\0';
}
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(buffer2, "%s", &buffer3)的真正目的是什么,除了获得第一个以空格分隔的“单词”?如果这不是目的,那么sscanf调用只是做strcpy(buffer3, buffer2)的不好方法。 -
您好 Joachim,在我遵循您的指示并在经过一些测试后决定使用 sscanf 之前,您试图帮助我解决这个问题。现在我可以阅读说明,但只能读到第一个空格。输入是 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-07,但它在 TAM 中停止
-
那么
buffer2的内容应该已经包含了你想要的字符串。你试过打印出buffer2的内容吗? -
顺便说一句
sprintf(fileoutputname, "%s.txt", buffer2);:buffer2未初始化。