#include<stdio.h> int main() { FILE *fp; int a,i; fp=fopen("C:\\Users\\86176\\Desktop\\sort.txt","r+"); while(!feof(fp)) { fscanf(fp,"%d",&a); printf("%d ",a); printf("\n"); } fclose(fp); return 0; } 修改代码
时间: 2023-08-23 20:04:19 浏览: 52
#include <stdio.h>
int main() {
FILE *fp;
int a;
fp = fopen("C:\\Users\\86176\\Desktop\\sort.txt", "r");
if(fp == NULL) {
printf("Failed to open file.");
return 1;
}
while(fscanf(fp, "%d", &a) == 1) {
printf("%d\n", a);
}
fclose(fp);
return 0;
}
修改后的代码加入了错误处理,防止打开文件失败的情况。同时,修改了 while 循环的条件,使用 fscanf 函数的返回值来判断是否读取成功,避免了使用 feof 函数可能引发的问题。
相关问题
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char num[10]; char pwd[20]; } Denglu; typedef struct { char name[20]; int age; Denglu denglu; } Node; int main() { Node* p = (Node*)malloc(sizeof(Node)); Node* p1 = (Node*)malloc(sizeof(Node)); FILE* fp; FILE* fp1; fp = fopen("users.txt", "r+"); fp1 = fopen("linshi.txt", "w+"); while (fread(p1, sizeof(Node), 1, fp)) { if (strcmp(p->denglu.num, p1->denglu.num) != 0) { fwrite(p1, sizeof(Node), 1, fp1); } } fclose(fp); fclose(fp1); remove("users.txt"); rename("linshi.txt", "users.txt"); free(p); free(p1); return 0; }
这段代码是一个从文件中删除指定用户的程序。程序的大致思路是,从文件中读取一个结构体,判断是否是要删除的用户,如果不是则将该结构体写入另一个文件中,最后删除原文件并将新文件重命名为原文件名。
不过在实现上存在一些问题。比如,在 while 循环中,每次读取的结构体是 p1,但是判断的却是 p。因此,需要将 p1 的内容赋值给 p,才能正确判断是否是要删除的用户。
另外,在写入新文件时,应该使用追加模式 "a+",而不是写模式 "w+"。因为写模式会先清空文件再写入,这样会导致文件中原有的数据全部丢失。
最后,需要注意的是,在写文件前需要将文件指针移到文件起始位置,否则会导致写入的数据覆盖文件中原有的数据。
以下是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char num[10];
char pwd[20];
} Denglu;
typedef struct {
char name[20];
int age;
Denglu denglu;
} Node;
int main() {
Node* p = (Node*)malloc(sizeof(Node));
Node* p1 = (Node*)malloc(sizeof(Node));
FILE* fp;
FILE* fp1;
fp = fopen("users.txt", "r+");
fp1 = fopen("linshi.txt", "a+");
while (fread(p1, sizeof(Node), 1, fp)) {
if (strcmp(p->denglu.num, p1->denglu.num) != 0) {
fwrite(p1, sizeof(Node), 1, fp1);
}
else {
printf("Delete user: %s\n", p1->denglu.num);
}
}
fseek(fp1, 0, SEEK_SET);
fseek(fp, 0, SEEK_SET);
while (fread(p1, sizeof(Node), 1, fp1)) {
fwrite(p1, sizeof(Node), 1, fp);
}
fclose(fp);
fclose(fp1);
remove("users.txt");
rename("linshi.txt", "users.txt");
free(p);
free(p1);
return 0;
}
```
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { FILE* fp1 = fopen("C:\\Users\\86131\\Desktop\\test.txt", "r"); FILE* fp2 = fopen("C:\\Users\\86131\\Desktop\\test1.txt", "a+"); char ch1 = fgetc(fp1); while (ch1 != EOF) { fputc(ch1, fp2); ch1 = fgetc(fp1); } char ch2 = fgetc(fp2); while (ch2 != EOF) { printf("%c", ch2); ch2 = fgetc(fp2); } fclose(fp1); fclose(fp2); return 0; }这段代码进入了死循环,有什么错误
这段代码进入了死循环的原因是,第一个while循环读取文件时,将文件指针fp1移动到了文件结尾位置,而第二个while循环读取文件时,文件指针fp2仍然指向文件结尾位置,因此会一直读取EOF,导致死循环。
为了解决这个问题,可以在第一个while循环结束后,调用rewind(fp2)函数将文件指针fp2重新指向文件开头,然后再读取文件。修改后的代码如下:
```
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
FILE* fp1 = fopen("C:\\Users\\86131\\Desktop\\test.txt", "r");
FILE* fp2 = fopen("C:\\Users\\86131\\Desktop\\test1.txt", "a+");
char ch1 = fgetc(fp1);
while (ch1 != EOF) {
fputc(ch1, fp2);
ch1 = fgetc(fp1);
}
rewind(fp2); // 将文件指针fp2重新指向文件开头
char ch2 = fgetc(fp2);
while (ch2 != EOF) {
printf("%c", ch2);
ch2 = fgetc(fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
```