有趣的C语言--文件结尾和重定向

1.文件结尾

计算机需要用某种方式来知道文件的起始和结尾,可以通过以下方法来做这个检测。

  1. 检测结尾的方法是在文件中放置一个特殊字符来标志结尾,这是在例如CP/M、IBM-DOS和MS-DOS的文本文件中曾使用的一种方法。比如可以内嵌一个CTRL+Z来标志文件结尾^Z。
  2. 另外一种方法是让操作系统存储文件大小的信息,如果一个文件有100字节的大小,那么如果程序已经从这个文件读取了100字节,那就表示这已经到了文件结尾。Unix对所有文件都使用此方法。

对于这两种方法,C的处理方法是让getchar()函数在到达文件结尾时返回一个特殊值。赋予该值的名称是EOF(End of file)。在stdio.h中定义如下#define EOF(-1)。-1是因为getchar()返回一个范围在0-127之间的值。

#include<stdio.h>
int main()
{
    int ch;
    while((ch=getchar())!=EOF)
    {
        //现在结束程序改为CTRL+Z
        //有些系统是CTRL+D为文件结尾信号
        putchar(ch);
    }
    return 0;
}

我们可以尝试输出:

1111
1111
2222
2222
ctrl^z   //回车后,程序将结束

2.重定向

1.输入重定向
当我们需要将其他文本中的内容输出到控制台可以使用输入重定向
新建在同一目录下创建word.txt,写入this is word.txt

cmd下执行 echo_eof <word.txt ( < 为输入重定向符号 )

2.输出重定向

echo_eof >word.txt(将控制台内容输出到word.txt,但是会覆盖原来的)
>>则是从末尾输入

3.组合重定向

echo < word.txt >a.txt (从控制台输出到word.txt,再输入到a.txt) 注意 word.txt可以不存在,但是a.txt必须存在

4.还有>& <& |

5.规则:

  1. 重定向符号将一个可执行文件与数据文件连接
  2. 不能用于数据文件与数据文件的连接
  3. 输入和输出都不能来自一个以上的文件

c从文件读取数据

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int ch;
    FILE * fp;
    char fname[50];//用于存放文件名

    printf("Enter the name of file\n");
    scanf("%s",fname);
    fp=fopen(fname,"r");//以只读方式打开文件
    if(fp==NULL)
    {
        printf("faile to open file\n");
        exit(1);
    }
    // getc(fp)从打开文件中获取一个字符
    while((ch=getc(fp))!= EOF)
    {
        putchar(ch);
    }
    fclose(fp);
    return 0;
}

源码位置:https://github.com/oDevilo/C

### 如何在C语言中删除文本文件末尾部分内容 在 C 语言中,可以通过 `fseek` `ftruncate` 函数来实现对文件末尾内容的删除。以下是具体方法: #### 方法概述 1. **定位文件指针位置**:通过 `fseek` 定位到需要保留的内容结束处。 2. **截断文件**:调用 `ftruncate` 或重新设置文件大小以丢弃多余的部分。 需要注意的是,在 Windows 平台上可能无法直接使用 `ftruncate`,因此可以采用覆盖的方式替代。 --- #### 示例代码 以下是一个完整的示例代码,展示如何删除文件末尾指定长度的内容: ```c #include <stdio.h> #include <unistd.h> // ftruncate() int main() { const char *filename = "example.txt"; FILE *fp; // 打开文件用于读写模式 fp = fopen(filename, "r+"); if (fp == NULL) { perror("Error opening file"); return (-1); } // 获取当前文件大小 fseek(fp, 0L, SEEK_END); // 移动文件指针到文件末尾 long fileSize = ftell(fp); // 记录文件总大小 // 假设我们想删除最后 N 字节的内容 long bytesToRemove = 10; // 需要删除的字节数量 if (bytesToRemove >= fileSize) { // 如果删除的数量大于等于文件大小,则清空文件 truncateFile(fp, filename); } else { long newFileSize = fileSize - bytesToRemove; // 设置新的文件大小(仅适用于 POSIX 系统) #ifdef _WIN32 // Windows 不支持 ftruncate,需手动覆盖剩余部分 fseek(fp, newFileSize, SEEK_SET); int ch; while ((ch = fgetc(fp)) != EOF && ch != '\n') {} // 清理缓冲区 fflush(fp); #else ftruncate(fileno(fp), newFileSize); // 截断文件至新大小 #endif printf("Successfully removed last %ld bytes from the file.\n", bytesToRemove); } fclose(fp); return 0; } // 辅助函数:清空整个文件内容 void truncateFile(FILE *fp, const char *filename) { fclose(fp); freopen(filename, "w", stdout); // 使用重定向方式清空文件 } ``` --- #### 关键点解析 1. **获取文件大小** 文件大小可通过先将文件指针移到末尾再调用 `ftell()` 来获得[^1]。 2. **计算目标位置** 新的目标文件大小为原文件大小减去待删除的字节数。如果待删字节数超过文件实际大小,则应完全清空文件[^2]。 3. **跨平台兼容性** - 在 Linux/Unix 上可直接利用 `ftruncate` 修改文件尺寸。 - 而对于 Windows 用户来说,由于标准库未提供此功能,通常采取覆盖法完成相同效果[^4]。 4. **错误处理机制** 当尝试访问不存在或者权限不足的文档时应当给予适当反馈,并安全退出程序运行流程[^3]。 --- ### 注意事项 - 若涉及二进制而非纯文本形式的操作,请特别留意编码差异以及潜在乱码风险。 - 删除动作不可逆,请谨慎执行相关逻辑前做好备份工作以防数据丢失。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值