当我尝试用函数确定文件结尾时feof(FILE *),我发现它不能像我预期的那样工作:即使流结束也需要额外的读取.例如,feof(FILE*)如果在读取10个字节后立即调用具有10个字节数据的文件,则不会告诉它.我需要一个额外的读取操作,当然返回0,然后feof(FILE *)会说"好的,现在你到达终点."
我的问题是为什么还有一个read需要以及如何确定文件结尾或如何知道文件流中剩余多少字节如果我不想要feof-style?
谢谢和最诚挚的问候.
在POSIX API中,read()返回0表示已到达文件结尾.为什么没有一个单独的函数告诉你read()将返回零 - 而不需要你实际调用read()?
询问的原因:由于你必须打电话read()才能发现它会失败,这使得文件读取算法更加复杂,效率可能略低,因为它们必须分配可能不需要的目标缓冲区.
我们可能想做什么......
while ( !eof )
{
allocate buffer
read to buffer
process buffer
}
Run Code Online (Sandbox Code Playgroud)
我们要做的是......
while ( true )
{
allocate buffer
read to buffer
if ( eof ) release buffer, break;
process buffer
}
Run Code Online (Sandbox Code Playgroud)
此外,它似乎像这种行为本身传播到更高级别的API,如fread()和feof()用C -而且创造了很多关于如何使用混乱的feof()正确:
我正在尝试从文件中读取每个字符,然后单独使用getc和putc将其打印到屏幕上.这是我的代码,
FILE *fp = fopen("new.txt","r+");
rewind(fp);
while( feof(fp) == 0 )
{
putc( getc(fp) , stdout);
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,它会遇到无限循环.我无法理解当文件只有几行时会发生这种情况.
新手.
我正在尝试用C语言读取文件
while(1){
if(feof(file)){
break;
}
printf("%c",fgetc(file));
}
Run Code Online (Sandbox Code Playgroud)
最后我得到了特殊的角色,比如 我在文件中没有这样的东西
我在从二进制文件复制和写入文本文件时遇到问题。我编写了一个能够从文本文件复制并写入二进制文件的程序,但我不能反过来。
这是我遇到问题的功能:
void CopyBin2Text(char* rafname, char* txtname)
{
FILE * fraf = fopen(rafname,"rb");
FILE * ftxt = fopen(txtname,"r+");
//READ FROM BINARY FILE
struct PERSON p;
int ByteOfBin;
printf("ID \t NAME \t\t BALANCE \n");
printf("---------------------------------------\n");
Run Code Online (Sandbox Code Playgroud)
当我运行我的程序时,它在打印上述语句后停止在这里
while(!feof(fraf))
{
fscanf(fraf, "%d %s %f", &p.ID, p.name, &p.balance);
ByteOfBin = ((p.ID/10-1)*sizeof(p));
fseek(ftxt,ByteOfBin, SEEK_SET);
fwrite((char *)&p, sizeof(p), 1, ftxt);
}
fclose(fraf);
fclose(ftxt);
}
Run Code Online (Sandbox Code Playgroud)
我注意到的另一个问题是文本文件变得太大而无法打开。结果是我必须删除文本文件并重新创建它。任何人都可以解释导致这种情况发生的原因吗?
#include <stdio.h>
int main()
{
FILE *fp;
char ch;
fp=fopen("file1.txt","r");
while(feof(fp))
{
ch=fgetc(fp);
printf("%c",ch);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何fgetc()知道要打印的字符读取(因为fp在整个程序中保持相同,不会增加); 同样如何识别EOF?我的意思是,它实际上是指什么才能知道它到底在哪里?如何检索该内存地址并进行打印?
我是一个努力学习C的Java程序员.特别是,我正在努力理解strcat().如果我打电话:
strcat(dst, src);
Run Code Online (Sandbox Code Playgroud)
我得到strcat()将修改我的dst字符串.但是它不应该单独留下src String吗?考虑以下代码:
#include<stdio.h>
#include<string.h>
void printStuff(char* a, char* b){
printf("----------------------------------------------\n");
printf("src: (%d chars)\t\"%s\"\n",strlen(a),a);
printf("dst: (%d chars)\t\"%s\"\n",strlen(b),b);
printf("----------------------------------------------\n");
}
int main()
{
char src[25], dst[25];
strcpy(src, "This is source123");
strcpy(dst, "This is destination");
printStuff(src, dst);
strcat(dst, src);
printStuff(src, dst);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪个在我的Linux机器上产生这个输出,用GCC编译:
----------------------------------------------
src: (17 chars) "This is source123"
dst: (19 chars) "This is destination"
----------------------------------------------
----------------------------------------------
src: (4 chars) "e123"
dst: (36 chars) "This is destinationThis is source123"
----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我假设完整的"This is source123"字符串仍在内存中,而strcat()已将char*src指针前进13个字符.但为什么?为什么13个字符?我已经玩过了dst字符串的长度,并且在strcat()完成后肯定会对src指针产生影响.但我不明白为什么......
另外......你会如何在GDB中调试呢?我尝试"步骤"进入strcat()函数,但我猜这个函数没有被调试器分析; "步骤"什么也没做.
谢谢!-ROA
PS …
我有一个带有cmd命令转发输出的文件.AC程序循环遍历字符,直到它到达文件末尾.但不幸的是,在文件实际结束之前,文件中有一些EOF指示符.该文件的内容是:
Abbildname PID Sitzungsname Sitz.-Nr. Speichernutzung
========================= ======== ================ =========== ===============
System Idle Process 0 Services 0 8 K
System 4 Services 0 5ÿ744 K
smss.exe 440 Services 0 276 K
csrss.exe 616 Services 0 1ÿ924 K
wininit.exe 720 Services 0 944 K
services.exe 792 Services 0 7ÿ892 K
lsass.exe 800 Services 0 14ÿ300 K
svchost.exe 924 Services 0 420 K
fontdrvhost.exe 952 Services 0 680 K
svchost.exe 960 Services 0 23ÿ880 K
WUDFHost.exe 1012 Services 0 7ÿ416 K
svchost.exe …Run Code Online (Sandbox Code Playgroud) 我的程序应该以下列方式运行:
CProgram <file.txt
file.txt可以包含任意数量的数据行.例如,
2 3 G 5 6
5 6 7
6 9 3 6 H
<<Blank line>>
Run Code Online (Sandbox Code Playgroud)
有没有办法知道没有更多的输入行?每个文件末尾都有一个空行.
我能够读取行但我的程序永远不会知道是否没有更多的数据要读取并且一直在等待更多的数据,正如它通常期望的那样.
这就是我读它的方式
while( fgets(line, sizeof(line), stdin) != NULL) {
... do something
}
Run Code Online (Sandbox Code Playgroud) 根据手册,int fscanf(FILE *stream, const char *format, ...)返回成功匹配和分配的输入项的数量,可以少于提供的数量,甚至在早期匹配失败的情况下为零。我该如何区分: