Tag: stdio

是否为明确定义的相同文件描述符创建了两个FILE?

POSIX指定了一个fdopen函数,它为文件描述符创建一个FILE 。 POSIX还指定了一个fileno函数,该函数返回FILE文件描述符。 这两个可以一起用于创建第二个FILE访问与现有文件相同的底层文件描述符: FILE *secondfile(FILE *f, const char *mode) { int fd = fileno(f); return fd >= 0 ? fdopen(fd, mode) : NULL; } 这是POSIX下定义明确的操作吗? 当我访问原始FILE和我为同一文件描述符创建的第二个FILE时会发生什么? 是否指定了交互? 如果有,怎么样? 从历史上看,Unices为您打开的20个文件使用了固定的FILE结构表。 fdopen() ,在已经与FILE关联的文件描述符上调用fdopen()会破坏现有文件并产生未定义的行为。 我不确定POSIX是否仍允许这样的stdio实现,这就是我提出这个问题的原因。

用于stdio文件句柄的GetFileInformationByHandle()

有没有办法使用GetFileInformationByHandle()与fopen()分配的stdio文件句柄? 使用fstat()和fileno()是不够的,因为我需要获取一些不属于struct stat的特定于Windows的信息,所以我想知道是否有任何方法可以将stdio FILE *句柄提供给GetFileInformationByHandle ()?

getline over socket

是否有一个libc函数可以执行与getline相同的操作,但是可以使用连接的套接字而不是FILE *流吗? 解决方法是在套接字上调用fdopen。 在这样做的时候应该注意什么。 有什么理由去做/不去做。 这样做的一个明显原因是调用getline和co,但是重写一些自定义getline可能是个更好的主意吗?

删除()打开文件是否“安全”?

我想添加使用相同的输入和输出文件的文件名到我的程序的可能性,以便它将替换输入文件。 由于处理过的文件可能非常大,我认为最好的解决方案是首先打开文件,然后删除它并创建一个新文件,即: /* input == output in this case */ FILE *inf = fopen(input, “r”); remove(output); FILE *outf = fopen(output, “w”); (当然,添加了error handling) 我知道并非所有系统都允许我删除打开的文件,只要在这种情况下remove()失败,这是可以接受的。 我很担心,如果没有任何系统允许我删除该打开文件,然后无法读取其内容。 C99标准将该情况下的行为指定为“实现定义”; SUS甚至没有提到这个案子。 你有什么看法/经验? 我要担心吗? 我应该避免这种解决方案? 编辑:请注意这不应该是一些主线function,而是“最后的手段”,如果用户指定相同的文件名作为输入和输出文件。 编辑:好的,还有一个问题:在这种特殊情况下,我提出的解决方案是否可能比仅仅打开输出文件只写(例如上面但没有remove()调用)更加邪恶。

即使添加了#include ,也会隐式声明popen

这是我的代码的一小部分。 #include #include #include #include #include #include #include #include #include #include #include #include … FILE * pipe; … pipe = popen (“ls /tmp -1”, “r”); … pclose(pipe); blarg.c:106: warning: implicit declaration of function ‘popen’ blarg.c:106: warning: assignment makes pointer from integer without a cast blarg.c:112: warning: implicit declaration of function ‘pclose’ blarg.c:118: warning: assignment makes […]

将2d数组写入C中的文件

我曾经使用下面的代码将1D数组写入文件: FILE *fp; float floatValue[5] = { 1.1F, 2.2F, 3.3F, 4.4F, 5.5F }; int i; if((fp=fopen(“test”, “wb”))==NULL) { printf(“Cannot open file.\n”); } if(fwrite(floatValue, sizeof(float), 5, fp) != 5) printf(“File write error.”); fclose(fp); /* read the values */ if((fp=fopen(“test”, “rb”))==NULL) { printf(“Cannot open file.\n”); } if(fread(floatValue, sizeof(float), 5, fp) != 5) { if(feof(fp)) printf(“Premature end of […]

从stdin读取写入C中的stdout

我正在尝试编写一个猫克隆来练习C,我有这个代码: #include #define BLOCK_SIZE 512 int main(int argc, const char *argv[]) { if (argc == 1) { // copy stdin to stdout char buffer[BLOCK_SIZE]; while(!feof(stdin)) { size_t bytes = fread(buffer, BLOCK_SIZE, sizeof(char),stdin); fwrite(buffer, bytes, sizeof(char),stdout); } } else printf(“Not implemented.\n”); return 0; } 我试着echo “1..2..3..” | ./cat echo “1..2..3..” | ./cat和./cat < garbage.txt但我在终端上看不到任何输出。 我在这做错了什么? 编辑:根据评论和答案,我最终这样做: […]

scanf正在收集错误的输入

#include int main(void) { double c; scanf(“%f”, &c); printf(“%f”, c); } 这是我试图编写的程序的一个漏洞,但是我对这个简单的问题也有同样的看法。 当我运行它并输入“1.0”时,它打印出“0.007812”。 我看过几个与我类似的问题,但找不到合适的答案。

C温度转换程序保持输出0华氏度到摄氏度

当我尝试将华氏温度转换为摄氏温度时,我在C中的温度转换程序保持输出0。 从Celsius到Fahrenheit的转换似乎工作得很好。 对于函数和部分,我做了完全相同的事情但是第二次转换时我一直得到0。 有人可以帮助我或告诉我我做错了什么? #include //Function Declarations float get_Celsius (float* Celsius); //Gets the Celsius value to be converted. void to_Fahrenheit (float cel); //Converts the Celsius value to Fahrenheit and prints the new value. float get_Fahrenheit (float* Fahrenheit); //Gets the Fahrenheit value to be converted. void to_Celsius (float fah); //Converts the Fahrenheit value to Celsius and […]

printf打印额外的“D”后getchar()调用

我正在尝试通过“C编程语言”,我遇到了一些关于printf和EOF角色的问题。 我正在使用mac终端并使用clang进行编译。 运行此代码: #include main() { int val; while ((val = getchar()) != EOF) printf(“%d\n”, val); /*val = 5;*/ /*printf(“hi\n”);*/ /*printf(“%d\n”, val);*/ printf(“%d\n”, val); } 像我期望的那样工作,阻塞直到我输入一个字符然后打印: “*character code*\n10\n” ,除了ctrl-d ,打印“ -1″然后退出。 在取消注释”val = 5;” 但是,输入“ ctrl-d ”会导致它打印: “5D” 。 我搞砸了它,发现第二次打印val(第三个注释语句)将只产生one “D”: “5D\n5” ,并且在变量(第二个注释语句)之前打印一个常量停止出现“D”: “hi\n5\n5”. 我绝对不想要D,如果有人能解释如何删除它,我将非常感激。