【发布时间】:2015-10-14 03:55:32
【问题描述】:
我搜索并没有得到一个非常有效的答案。虽然我知道那里可能仍然有很多答案。老实说,因为我是 C/C++ 的初学者,所以我找不到它。
我的问题是我有一个文本文件,其中包含由管道('|')分隔的数据。实际上是一个日志文件。在每个条目中,事物由管道('|')分隔,每个条目由新行('\n')分隔,它真的很长。所以我想做的是,当用户给出一个序列sequence=[2,5,7] 时,该函数应该能够读取该数组并仅给出以该管道位置开头的内容。所以这里它应该把第二、第五和第七件事放到一个文本文件中。下面是我使用的代码。由于某种我找不到的原因,它不起作用。它给出的结果文本文件只打印出“\n”,仅此而已。它也比文件中的条目更重要。
minorSeparatorChar 是作为 '|' 给出的字符
majorSeparatorChar 是作为 '\n' 给出的字符
inFile输入文本文件
outFile 输出文本文件
minSepCount 次要分隔符计数
majSepCount 主要分隔符计数
sequence 是一个全局 const int 数组
void getFormattedOutput(char * inFile, char * outFile, char minorSeparatorChar,char majorSeparatorChar){
FILE *readFile,*writeFile;
int charactor=0, minSepCount=0, i=0,majSepCount = 0;
int flagMin = 0;
char charactorBefore = NULL;
readFile = fopen(inFile,"r"); // opens the file for reading
writeFile = fopen(outFile,"w"); // opens the file for writing
if (readFile==NULL || writeFile == NULL){
printf("\nFile creation is not a sucess, Exiting program..\n");
exit(0);
}
while(charactor!=EOF){
charactorBefore = charactor;
if (charactor==minorSeparatorChar)
flagMin=1;
charactor = fgetc(readFile);
if(charactorBefore == minorSeparatorChar){
flagMin = 0;
if (minSepCount==sequence[i]){
fputc(charactor,writeFile);
continue;
}
i++;
minSepCount++;
}
else if (charactorBefore == majorSeparatorChar){
minSepCount=0;
i=0;
majSepCount++;
fputc('\n',writeFile);
}
else{
if(flagMin==1)
fputc(charactor,writeFile);
continue;
}
}
fclose(readFile);
fclose(writeFile);
}
例如,如果输入文件有
33|333|67|787|7889|9876554|56
20151001|0|0|0|0||94|71
1|94|71|1|94|71|1
如果我给出序列[2,5,6]
它应该打印到文件中
67 9876554 56
0 94 71
71 71 1
【问题讨论】:
-
请更详细地描述您的程序的行为。 “它不起作用”很少传达任何有意义的信息。特别是,请创建一个MCVE,然后提供示例输入、预期输出和实际输出。
-
序列在哪里定义?我看不到它。你真的有一个全局变量,在打印字符之前要检查一下(换行符除外),所以这一定是问题所在,你甚至不让我们看到那个变量中有什么?
-
是的,全局变量是序列[]数组。
-
第二行的字段 5 是空字符串还是数字 94?换句话说,几个连续的分隔符是否被视为一个分隔符?
-
它的 94。没有两个连续的分隔符被视为 2。它不应该打印任何内容并忽略。
标签: c substring text-files c-strings