我不太确定C中的函数printf何时返回负数。 我知道printf会在打印字符串失败时返回一个负数,很可能是-1。 但是我想知道为什么以及何时打印字符串失败。 比如我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma pack(1)
typedef struct{
char name[14];
int age;
int yearofbirth;
}person;
int print(person var)
{
if(printf("%s\n", var.name)<0)
{
if(printf("%d\n", var.age)<0)
{
if(printf("%d\n\n", var.yearofbirth)<0)
{
return 1;
}
}
}
return 0;
}
int main(void)
{
int i=0;
person thing;
FILE* file=fopen("Data.txt", "r");
if(file)
{
long amountofstruct = 0;
char* z=(char*)malloc(sizeof(char)*200);
while(fgets(z,100,file)!=NULL)
{
amountofstruct++;
}
fseek(file,0,SEEK_END);
free(z);
int k=0;
/* while(k<amountofstruct)
{
fseek(file,sizeof(person)*k,SEEK_SET);
fread(&function[k], sizeof(person),1,file);
k++;
}
int szt;
printf("%p",function);
for(szt=0;szt<amountofstruct;szt++)
{
printf("Person %d:\tName:%s\t Age:%i\t Year Of Birth:%i\n",szt+1,function[szt].name,function[szt].age,function[szt].yearofbirth);
}*/
printf("thesizeofstruct:%ld\n",sizeof(person));
printf("%ld",amountofstruct);
//thing.name = {' ',' ',' ',' ',' ',' ',' ',' ',' ','\0'};
char *l = (char*)malloc(11);
while(k<amountofstruct)
{
fseek(file,sizeof(person)*k,SEEK_SET);
if(fread(&thing, sizeof(thing), 1, file)!=0)
{
thing.name[13]='\0';
// printf("sizeof(thing string)%lu\n sizeof(thing)%lu\n", sizeof(thing.name),strlen(thing.name));
if(print(thing)==0)
{
printf("\nThe thing failed, sorry");
return 0;
}
//char *p = strchr(thing.name, ' ');
// *p='\0';
// strcpy(l,thing.name);
//printf("Person %d: \t Name: %s\t Age: %d\t Year Of Birth: %d\n", k+1, l, thing.age, thing.yearofbirth);
// thing.name[0]='\0';
// thing.age=0;
// thing.yearofbirth=0;
k++;
}
}
free(l);
}
else
{
perror("The file could not be opened");
}
getchar();
return 0;
}
printf打印函数print中的整数var.age和var.yearofbirth总是返回一个负数。这条线
printf("%s\n", var.name);
功能打印中的成功,但就是这样。但在我的Data.txt中,每个人的年龄和出生年份都非常明确地提供如下。
Name Age YearofBirth
那么为什么printf会返回一个负数呢? 谢谢,
答案 0 :(得分:0)
printf(3)
之前-1
与fclose(3)
关联的FILE
描述符, printf()
将返回stdout
。另一个例子是,如果某个其他进程已撤销您的文件描述符,或者磁盘是否已满,或者您是否超出磁盘配额,或者套接字因某种原因而关闭(情况printf(3)
与套接字关联) )。有很多事情可以使-1
函数族返回printf()
。通常,它与内部执行的系统调用关联的外部事件相关联。假设您对管道printf()
,并且读取过程(接收数据的过程)突然死亡。您的write(2)
将无法write(2)
缓冲区数据并从-1
收到错误,然后它将返回errno
,您必须检查{{1}对于错误的实际原因。