C 如何检查文件中是否没有内容,以及如何避免读取文件中的最后一个字符?
我在每个字符串后都使用逗号作为分隔符C 如何检查文件中是否没有内容,以及如何避免读取文件中的最后一个字符?,c,C,我在每个字符串后都使用逗号作为分隔符 fp=fopen("log.dat","ab"); fprintf(fp,"%s%c",enteredUsername,','); fclose(fp); 从文件中读取: fp=fopen("log.dat","rb"); int c; while ((c = fget
fp=fopen("log.dat","ab");
fprintf(fp,"%s%c",enteredUsername,',');
fclose(fp);
从文件中读取:
fp=fopen("log.dat","rb");
int c;
while ((c = fgetc(fp)) != EOF)
printf("%c", c);
我怎样才能:
1.避免读取文件中的最后一个字符,
2.检查文件是否为空?为什么要避免读取最后一个字符?您可以使用EOF检查文件是否为空
if( (c= fgetc(fp)) == EOF){
//do stuff
}
else{
printf("File is empty\n")
return 0;
}
这对我很管用。为什么要避免阅读最后一个字符?您可以使用EOF检查文件是否为空
if( (c= fgetc(fp)) == EOF){
//do stuff
}
else{
printf("File is empty\n")
return 0;
}
这对我很有用。您可以使用一个字符的缓冲区,如下所示:
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("log.dat", "rb");
if(fp == NULL) return;
int prev = -1000;
int c;
while ((c = fgetc(fp)) != EOF) {
if(prev >= 0) {
printf("%c", prev);
}
prev = c;
}
fclose(fp);
return 0;
}
输出
one,two,three
您可以使用一个字符的缓冲区,如下所示:
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("log.dat", "rb");
if(fp == NULL) return;
int prev = -1000;
int c;
while ((c = fgetc(fp)) != EOF) {
if(prev >= 0) {
printf("%c", prev);
}
prev = c;
}
fclose(fp);
return 0;
}
输出
one,two,three
#包括
内部主(空){
无符号计数器;
用于(计数器=0;1;计数器++){
int-ch;
char lastchar;
ch=getc(标准偏差);
如果(ch==EOF)中断;
if(计数器)putc(lastchar,stdout);
lastchar=ch;
}
如果(!counter)fprintf(stderr,“文件为空\n”);
else fprintf(标准字符,“读取%u个字符。\n”,计数器);
返回0;
}
//用以下方法进行测试:
//回声-n“a,b,c,”>bagger
//./a.out#包括
内部主(空){
无符号计数器;
用于(计数器=0;1;计数器++){
int-ch;
char lastchar;
ch=getc(标准偏差);
如果(ch==EOF)中断;
if(计数器)putc(lastchar,stdout);
lastchar=ch;
}
如果(!counter)fprintf(stderr,“文件为空\n”);
else fprintf(标准字符,“读取%u个字符。\n”,计数器);
返回0;
}
//用以下方法进行测试:
//回声-n“a,b,c,”>bagger
//./a.通过使用一个字符缓冲区进行输出。读取最后一个字节或报告它是犯罪行为吗?2)在循环中添加计数器。如果循环后计数器为零,则文件为空。读取两个字符,c1
和c2
。如果c2==EOF
,则c1
是文件中的最后一个字符(在您的特定情况下,可能是'\n'
或','
)。。。您无法避免阅读最后一个字符,但您肯定可以避开issuethanks@wildplasser。关于我如何做问题1的任何建议?intc1,c2=fgetc(fp);而(c1=c2&&(c2=fgetc(fp))!=EOF){/*…*/}
,通过使用一个字符缓冲区。读取最后一个字节或报告它是犯罪行为吗?2)在循环中添加计数器。如果循环后计数器为零,则文件为空。读取两个字符,c1
和c2
。如果c2==EOF
,则c1
是文件中的最后一个字符(在您的特定情况下,可能是'\n'
或','
)。。。您无法避免阅读最后一个字符,但您肯定可以避开issuethanks@wildplasser。关于我如何做问题1的任何建议?intc1,c2=fgetc(fp);虽然(c1=c2&&(c2=fgetc(fp))!=EOF){/*…*/}
我不想在输出中打印最后一个逗号,我创建的程序将它放在每一个字符串之后如果在fprint之前放一个if呢?我不想在输出中打印最后一个逗号,我创建的程序将它放在每条字符串之后如果在fprint之前放一个if呢?将lastchar
definition移出循环:)lastchar已被指定一个if值(计数器>0)。并且它仅在(计数器>0)时使用。不需要将其移出循环,lastchar永远不需要在循环之外。正如您所拥有的,每次通过循环都会创建一个新的lastchar
,并且旧的(ch
)的内容会丢失(不能保证新旧lastchar
共享相同的地址),它会被输出(有条件地取决于计数器)在为其指定新值之前。问题太深,无法发表评论。。。关于这一点,我提出了一个全新的问题,请参见将lastchar定义移出循环:)lastchar已被分配一个值if(计数器>0)。并且它仅在(计数器>0)时使用。不需要将其移出循环,lastchar永远不需要在循环之外。正如您所拥有的,每次通过循环都会创建一个新的lastchar
,并且旧的(ch
)的内容会丢失(不能保证新旧lastchar
共享相同的地址),它会被输出(有条件地取决于计数器)在为其指定新值之前。问题太深,无法发表评论。。。关于这一点,我提出了一个全新的问题,从@wildplasser的文章中可以看出,逗号可能不是最后一个字符。它在我的测试文件中。我已将测试文件更改为更可信的文件。如果文件为空,prev
仍将是<0
。从@wildplasser开始,逗号可能不是最后一个字符。它在我的测试文件中。我已将测试文件更改为更可信的文件。如果文件为空,prev
仍将是<0
。