【发布时间】:2022-01-03 18:18:24
【问题描述】:
(C,Visual Studio 2022 环境)
我必须编写一个程序来读取 .txt 文件(逐个字符)并将每个字符放入另一个 .txt 文件中(在由 Visual Studio 创建的同一目录中)。 最初的.txt文件太长,所以在这个问题中我写了一小部分数据。
这是我的初始文件.txt:
3.456789 3.456789 3.5671234566 3.450934759435735738457 3.3298017238973289742398074238 3.456789 3.456789 3.5671234566 3.450934759435735738457 3.3298017238973289742398074238 3.456789 3.456789 3.5671234566 3.450934759435735738457 3.3298017238973289742398074238 3.456789 3.456789 3.5671234566 3.450934759435735738457 3.3298017238973289742398074238
这是代码:(我只使用了 main.c,因为它只是测试 C 输入输出的测试):
代码应该做这些事情:
- 打开一个只读文件。 (由 f 指向)。
- (空指针检查。我检查了 f)。
- 我用名称 x 定义了数组。 (它是一个指向数组第 0 个元素的指针)。
- 我定义了 CHAR COUNT,因为我在第一个 while 循环(读取部分)中使用了它。
- (空指针检查。我检查了 x)。
- 读取由以下 3 个部分组成的无限循环组成:读取、检查、使用。
阅读部分:我赋值给计数fgetc的值[fgetc()返回值是一个字符]。 fgetc 获取 f 流的字符。
检查部分:我检查了它是否等于 EOF 宏。如果是这种情况,则“中断”并超出第一个 while 循环。 {在写这个问题时,我正在考虑这个阶段可能出现的一个错误:如果这个检查条件成立,那么第二个数组就会被执行,但是在第二个 while 循环中我会遇到另一个错误,因为我没有阅读完整的第一个文件}。
使用部分:如果 if 检查为假,则执行 calloc 并分配足够的内存 (i, sizeof(double)) 来存储使用 fgetc 读取的值。
(另一个空指针检查。我再次检查了 x,因为我已经分配了 x)。 {在写这个问题时,我在想是否必须检查 calloc,因为它不像 malloc。 malloc 用随机的东西填充分配的内存,但 calloc 将内存初始化为零}。
我分配了值 (x[i] = count)。
当然,我将 i 加 1。
- 在第一个循环之外,我打开了另一个文件(由 g 指向),但该文件是只写文件。
- (空指针检查。我检查了 g)。
- 第二个无限while循环,但我使用了fputc(它在文件上写入一个字符)。
- (EOF 检查。我检查了 x[j] 是否等于 EOF 宏。 - 在第二个 while 循环之外,我释放了分配的内存,然后我关闭了 txt 文件。 (在 return 0 语句之前)。
总结一下我的问题:
-
“在写这个问题时,我正在考虑这个阶段可能出现的一个错误:如果这个检查条件成立,那么第二个数组就会被执行,但是我在第二个 while 循环中会出现另一个错误,因为我没有' t 完全读取第一个文件”你怎么看?
-
“在写这个问题时,我在想是否必须检查 calloc,因为它不像 malloc。malloc 用随机的东西填充分配的内存,但 calloc 将内存初始化为零”。你觉得呢?
还有一个普遍的问题:以这种方式编写这个程序是否合法,或者你认为有更明智的方式来完成同样的任务? (注意:我知道我可以使用 fprintf() 和 fscanf(),但我想测试我编写一个执行相同任务但逐个字符(在长 txt 文件上)的程序的技能。
(我有两个错误和三个警告:
第一个错误:使用了未初始化的局部变量 f(为什么?我已经初始化它,因为它指向文件的开头)
第二个错误:使用了未初始化的局部变量 x(为什么?x 是一个指针,我检查了它是否为空指针,所以我不必初始化它)
第一个警告:“function”:不兼容的类型(从“FILE *”到“const char *”。
剩余的警告和错误一样,调试器也将其复制到警告列表中。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE* f = fopen(f, "r");
if (f == NULL) {
return NULL;
}
int* x; char count = 0;
if (x == NULL) {
return NULL;
}
unsigned int i = 1;
while (1) {
count = fgetc(f);
if (count == EOF) {
break;
}
int* x = calloc(i, sizeof(double));
if (x == NULL) {
return -3;
}
x[i] = count;
i++;
}
FILE* g = fopen("otherfile.txt", "w");
if (g == NULL) {
return -2;
}
int j = 1;
while (1) {
fputc(x[j], g);
if (x[j] == EOF) {
break;
}
j++;
}
free(x);
fclose(f);
fclose(g);
return 0;
}
【问题讨论】:
-
如果变量是指向
int的指针,你为什么要calloc(i, sizeof(double))? -
FILE* f = fopen(f, "r");fopen的第一个参数应该是文件名。这是您的第一个错误的原因 -
int* x;您不能在此行之后使用x(就像您在此处所做的那样:if (x == NULL) {),除非您为其分配了一些东西(例如 malloc/calloc)。您稍后会这样做,但是您将分配结果分配给另一个局部变量 *x。这是您的第二个错误的原因 -
解决该问题的一种更简单的方法(尽管可能效率不高)是从 file1 中读取一个字符并将其直接写入 file2,同时同时打开两个文件。循环这个直到你到达 EOF,文件结尾。
-
附带说明,
malloc和calloc基本上是相同的东西。calloc另外清除malloc分配的内存,并且可以选择在多个块中分配内存(在这个项目中你都不需要)。
标签: arrays c input memory-management output