Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何检查文件中是否没有内容,以及如何避免读取文件中的最后一个字符?_C - Fatal编程技术网

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