这个问题让我感到困惑,因为我想要一些投入。我正在输入一个包含许多复数的ascii文件,我使用strtok将其与分隔符"+"
和" "
进行标记。该文件格式如下:[[[0+0i 0+0i 0+0i 0+0i.......]]]
。我希望第一个令牌为0
,第二个令牌为0i
。我实际上将"0,0i"
作为我的第一个令牌。以下是使用的代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char data[]={0};
int line = 0;
char *datap[231000];
int i,n;
void main()
{
FILE * filei = fopen("signal_subband_16.ascii","r");
FILE * fileo = fopen("Output_file_simple.txt","a");
if(filei==NULL){
printf("There was an error opening the input file");
exit(1);
}
else if(fileo==NULL){
printf("There was an error opening the output file");
exit(1);
}
else{
while(fgets(data,999999,filei)){
line ++;
// printf("Line: %d -> %s", line, data);
}
}
datap[0]=strtok(data,"[+");
n = 1;
while(datap[n-1]!=NULL){
datap[n] = strtok(NULL,"i+");
n++;
}
//for(i=0;i<n;i+2){
// printf("%s %s\n", datap[i], datap[i+1]);
//}
printf("%s\n, %s\n",datap[0], datap[1]);
fclose(filei);
fclose(fileo);
}
非常感谢任何帮助或推动正确答案。 感谢
新代码功能
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char data[999999];
int line = 0;
char *datap[231000];
int i,n;
void main()
{
FILE * filei = fopen("signal_subband_16.ascii","r");
FILE * fileo = fopen("Output_file_simple.txt","a");
if(filei==NULL){
printf("There was an error opening the input file");
exit(1);
}
else if(fileo==NULL){
printf("There was an error opening the output file");
exit(1);
}
else{
while(fgets(data,999999,filei)){
datap[0]=strtok(data,"[ +");
n = 1;
while(datap[n-1]!=NULL){
datap[n] = strtok(NULL,"i +]");
n++;
}
for(i=0;i<n;i+2){
printf("%s %s\n", datap[i], datap[i+1]);
}
memset(data,0,999999);
line ++;
}
}
fclose(filei);
fclose(fileo);
}
答案 0 :(得分:2)
您的代码最大的问题是您在data
数组的范围之外编写。当您声明一个具有空大小的数组时,它会使它足够大以容纳初始化列表中的值。所以
char data[] = {0};
声明一个只有1个元素的数组,相当于
char data[1] = {0};
你需要使这个大到足以保持你正在阅读的行fgets()
,所以它应该是:
char data[999999];
没有必要对其进行初始化,因为在用fgets()
填写之前不要使用它。
使用strtok()
时遇到的问题是您没有在分隔符列表中包含空格。此外,如果您希望i
字符成为令牌的一部分,则不应位于分隔符列表中。并且您需要在分隔符中包含]
,因此您不会在最后一个标记中包含]]]
。所以循环应该是:
datap[0]=strtok(data,"[+");
n = 1;
while(datap[n-1]!=NULL){
datap[n] = strtok(NULL," +]");
n++;
}
另请注意,在此循环出现的位置,data
仅包含文件的最后一行。您没有解析文件中的任何其他行。目前尚不清楚这是否有意。如果要解析文件的所有行,则此循环应位于读取每一行的循环内。并且你需要为每一行复制data
,因为每次读一行都会覆盖它,而strtok()
只是返回指向数组的指针。