我这里有这个代码:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int main()
{
FILE *inFile, *outFile;
int i;
char buffer[1];
bool lastIsComma = false;
inFile = fopen("csv.txt","r");
outFile = fopen("output.txt","w");
while(!feof(inFile))
{
fscanf(inFile,"%c",&buffer);
i = atoi(buffer);
if((i!=0) || (*buffer == '0'))
{
fprintf(outFile,"%d",i);
lastIsComma = false;
}
else
{
if((lastIsComma) && (feof(inFile)))
{
fputc('0',outFile);
}
if((lastIsComma) && (!feof(inFile)))
{
fputc('0',outFile);
fputc(',',outFile);
}
if((!lastIsComma) && (feof(inFile)))
{
fputc(',',outFile);
fputc('0',outFile);
}
if((!lastIsComma) && (!feof(inFile)))
{
fputc(',',outFile);
}
lastIsComma = true;
}
}
fclose(inFile);
fclose(outFile);
return 0;
}
这段代码的作用是在csv中的连续逗号之间加零,例如1,2 ,,,, 3, - &gt; 1,2,0,0,0,3,0
我的代码适用于以逗号结尾的csv,如上例所示,但不适用于以值结尾的csv,例如1,2,3,4,5(我得到的是1,2,3,4,55,而不是最后额外的'5'。
有人能说出代码中有什么问题吗?感谢。
答案 0 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
const char *srcStr = "1,2,,,3,4,,,";
char destStr[100] = {'\0'}, prevCh = '\0';
int destIdx = 0;
for(int srcIdx = 0; srcIdx < strlen(srcStr); srcIdx++)
{
if(srcStr[srcIdx] != ',')
{
destStr[destIdx++] = srcStr[srcIdx];
}
else if(prevCh != ',')
{
destStr[destIdx++] = srcStr[srcIdx];
}
else
{
destStr[destIdx++] = '0';
destStr[destIdx++] = srcStr[srcIdx];
}
prevCh = srcStr[srcIdx];
}
if(destStr[destIdx - 1] == ',')
destStr[destIdx] = '0';
printf("%s\n", srcStr);
printf("%s\n", destStr);
system("pause");
return 0;
}
'0'
时必须递增两次。','
,我们可以将其添加到目标字符串。','
但前一个字符不是','
,我们可以将','
复制到目标字符串。','
且前一个字符为','
,则必须在目标字符串中插入'0'
。我们还需要包含“,'
。目标索引必须在此块中递增两次。','
,请向其添加另一个'0'
。1,2 ,,, 3,4 ,,,
1,2,0,0,3,4,0,0,0
按任意键继续 。 。
while((ch = getc(inFile)) != EOF)
{
if(ch != ',')
{
destStr[destIdx++] = ch;
}
else if(prevCh != ',')
{
destStr[destIdx++] = ch;
}
else
{
destStr[destIdx++] = '0';
destStr[destIdx++] = ch;
}
prevCh = ch;
}
答案 1 :(得分:0)
重复最后一个数字(即“1,2,3,4,55”)的原因是因为while循环(while(!feof(inFile)))运行一次迭代比实际可用数据多一次文件。
fscanf的返回值(inFile,“%c”和&amp; buffer);可以检查以确保从文件读取的值有效。否则设置为EOF(0xFFFFFFFF)