C语言读取文本文件最后一行重复读取问题

0x00 问题

C代码如下:

#include <stdio.h>
#include <stdlib.h>

void main(void)
{
        FILE *fp = NULL;
        fp = fopen("test.txt","r");
        if(fp==NULL)
        {
                printf("文件不存在\n");
                exit;
        }
        char str[30]={'\0'};
    
        while(!feof(fp))
        {
                fscanf(fp,"%s",str);
                printf("%s\n",str);
        }
        fclose(fp);
}

文本文件中的内容如下:

a
b
c

程序的读取结果如下,最后一行出现重复读取问题:

a
b
c
c

0x01 问题解决办法

需要遵循先读取再判断文件是否结束的原则。
在C语言中,feof()函数的使用是根据指针内容判断的,而非指针位置,无论指针是否到头,甚至超出了,它都需要先读取指针的内容,看一看内容是否是EOF,然后才知道文件是否到头。上述代码中第四次循环遇到EOF时不能读入有效字符,就会重复输出最后一个字符。
故将代码修改为如下形式:

#include <stdio.h>
#include <stdlib.h>

void main(void)
{
	FILE *fp = NULL;
	fp = fopen("test.txt","r");
	if(fp==NULL)
	{
		printf("文件不存在\n");
		exit;
	}
	char str[30]={'\0'};
	
	fscanf(fp,"%s",str);
	while(!feof(fp))
	{
		printf("%s\n",str);
		fscanf(fp,"%s",str);
	}
	fclose(fp);
}
在C语言中,读取文本文件并逐行删除其实涉及到两个步骤:首先读取文件内容,然后处理每一行的内容(在这里删除)。以下是简单的示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_LINE_LENGTH 100 void delete_line(char *filename) { FILE *file = fopen(filename, "r+"); // 打开文件用于写 if (file == NULL) { perror("Failed to open file"); return; } char line[MAX_LINE_LENGTH]; size_t line_length; while (fgets(line, sizeof(line), file)) { // 逐行读取 line_length = strlen(line); if (line[line_length - 1] == '\n') { // 如果行尾有换行符,去掉它 line[--line_length] = '\0'; } printf("Before deletion: %s", line); // 可视化当前行 // 删除行的操作(这里只是一个打印,实际删除需要更复杂的文件操作) printf("\ndeleted: %s\n", line); // 在这里可以添加真正删除行的代码,例如向另一个文件写入,或直接修改原文件(注意原地修改可能会导致数据丢失) // fseek(file, -strlen(line), SEEK_CUR); // 移动到上一行开始位置(假设删除了这一行) // fprintf(file, "\n"); // 写回换行符填补空位 } rewind(file); // 将文件指针归位到开头 fclose(file); // 关闭文件 } int main() { char filename[] = "example.txt"; delete_line(filename); return 0; } ``` 这个例子中,我们打开文件并逐行读取,如果需要删除行,你可以选择将那一行写入一个新的文件,而不是简单地从内存中删除(因为这会导致原始数据丢失)。请注意,在实际操作中删除文件内容时,你需要确保正确处理可能出现的错误,并可能需要管理额外的内存。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值