本题要求实现uniq命令,对于相邻的重复行(包括连续n (n≥3)行重复的情况),只保留一行。题目保证文件每一行的大小不超过64字节。需要实现的功能 打开文件,argv[1]为输入文件的路径 当文件路径非法时,打印can't open file,结尾带换行符 读取文件,对所有相邻行,若其重复,则仅保留一行。注意保留行尾的换行符 创建文件,argv[1]为输出文件的路径(同一文件),写入去重后的行 输入样例 Shizuoka 0 Shizuoka 0 Kanagawa 1 Kanagawa 1 Toukyou 2 Toukyou 2 Saitama 3 Saitama 3 Chiba 4 Chiba 4 输出样例 Shizuoka 0 Kanagawa 1 Toukyou 2 Saitama 3 Chiba 4 C语言实现
时间: 2023-06-13 08:02:54 浏览: 56
下面是一个简单的C语言实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LINE_LEN 64
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
FILE* fp = fopen(argv[1], "r");
if (!fp) {
printf("Can't open file.\n");
return 1;
}
char buffer[MAX_LINE_LEN + 1];
char last_line[MAX_LINE_LEN + 1] = {0};
while (fgets(buffer, MAX_LINE_LEN + 1, fp)) {
if (strcmp(buffer, last_line) != 0) {
printf("%s", buffer);
strncpy(last_line, buffer, MAX_LINE_LEN);
}
}
fclose(fp);
fp = fopen(argv[1], "w");
if (!fp) {
printf("Can't open file.\n");
return 1;
}
rewind(fp);
while (fgets(buffer, MAX_LINE_LEN + 1, stdin)) {
if (strcmp(buffer, last_line) != 0) {
fputs(buffer, fp);
strncpy(last_line, buffer, MAX_LINE_LEN);
}
}
fclose(fp);
return 0;
}
```
该程序首先尝试打开命令行参数指定的文件,如果文件不存在或者无法打开,则输出错误信息并退出。接着,该程序逐行读取文件内容,并与上一行进行比较。如果两行不同,则输出该行,并将该行保存为上一行。最后,该程序重新打开文件,并将去重后的内容写入同一文件中。需要注意的是,由于fgets函数读取的每一行都会包含行尾的换行符,因此输出和写入文件时需要保留该换行符。