相关疑难解决方法(0)

确定流结束时EOF问题

当我尝试用函数确定文件结尾时feof(FILE *),我发现它不能像我预期的那样工作:即使流结束也需要额外的读取.例如,feof(FILE*)如果在读取10个字节后立即调用具有10个字节数据的文件,则不会告诉它.我需要一个额外的读取操作,当然返回0,然后feof(FILE *)会说"好的,现在你到达终点."

我的问题是为什么还有一个read需要以及如何确定文件结尾或如何知道文件流中剩余多少字节如果我不想要feof-style?

谢谢和最诚挚的问候.

c c++ io eof

1
推荐指数
1
解决办法
759
查看次数

为什么POSIX API没有文件结束功能?

在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()正确:

posix eof posix-api

1
推荐指数
1
解决办法
1932
查看次数

使用getc从文件中读取并使用putc进行打印

我正在尝试从文件中读取每个字符,然后单独使用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 file-io file getc

1
推荐指数
1
解决办法
5420
查看次数

用C语言读取文件

我正在尝试用C语言读取文件

while(1){
        if(feof(file)){
            break;
        }
        printf("%c",fgetc(file));
    }
Run Code Online (Sandbox Code Playgroud)

最后我得到了特殊的角色,比如 我在文件中没有这样的东西

c file

1
推荐指数
1
解决办法
109
查看次数

如何在C中从二进制文件读取到文本文件?

我在从二进制文件复制和写入文本文件时遇到问题。我编写了一个能够从文本文件复制并写入二进制文件的程序,但我不能反过来。

这是我遇到问题的功能:

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)

我注意到的另一个问题是文本文件变得太大而无法打开。结果是我必须删除文本文件并重新创建它。任何人都可以解释导致这种情况发生的原因吗?

c binary binaryfiles file text-files

1
推荐指数
1
解决办法
6917
查看次数

fgetc()如何知道下一个字符的地址?如何检索当前的字符地址?

#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

1
推荐指数
1
解决办法
378
查看次数

c strcat覆盖源字符串?

我是一个努力学习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 …

c strcat

1
推荐指数
1
解决办法
1285
查看次数

在实际EOF之前的cmd的转发输出中的文件结尾

我有一个带有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)

c cmd batch-file stream

1
推荐指数
1
解决办法
71
查看次数

C语言:当从文件重定向输入时,如何知道何时没有来自stdin的输入

我的程序应该以下列方式运行:

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)

c gcc c11

1
推荐指数
1
解决办法
106
查看次数

在 C 中使用 fscanf() 如何区分文件结尾和错误?

根据手册,int fscanf(FILE *stream, const char *format, ...)返回成功匹配和分配的输入项的数量,可以少于提供的数量,甚至在早期匹配失败的情况下为零。我该如何区分:

  • 零匹配和分配的项目
  • 文件结尾
  • 一个空文件?

c scanf eof feof

1
推荐指数
1
解决办法
138
查看次数

标签 统计

c ×9

eof ×3

file ×3

batch-file ×1

binary ×1

binaryfiles ×1

c++ ×1

c11 ×1

cmd ×1

feof ×1

file-io ×1

gcc ×1

getc ×1

io ×1

posix ×1

posix-api ×1

scanf ×1

strcat ×1

stream ×1

text-files ×1