c - C - 文件输入/输出重定向和 EOF
问题描述
我的 C 类让我们从一个条目数未知但格式已知的文件中读取,如下所示:
名,姓
地址第一行
地址线 2
邮政编码
所以我们动态地分配一个指向结构的指针数组,我创建了一个函数 getData,它将使用 get 逐行读取并适当地存储所有内容。我最大的问题是如何使它在文件没有可读取的内容时停止收集数据。我粗略地想出了while((strcpy(ptr[i].name, buffer))!=EOF)
一个我确定没有意义的方法,但它似乎有点工作,特别是因为它几乎可以正确打印出每个条目。这是代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "address.h"
struct AddressBook {
char *name[10];
char *address[50];
int zip;
};
typedef struct AddressBook adds;
void getData(adds *ptr);
int main() {
//adds *ptrArr[50];
int size = 50;
adds *ptrs = (adds*)calloc(size, sizeof(adds*)); //array of 50 ptrs allocated dynamically
if (ptrs == NULL) {
printf("Bad memory allocation...exiting.");
exit(0);
}
else
printf("Allocation successful...\n");
getData(ptrs);
system("pause");
return 0;
}
void getData(adds *ptr) {
printf("Gathering data...\n");
char buffer[50];
int i = 0;
gets(buffer);
while((strcpy(ptr[i].name, buffer))!=EOF) {
if (i > 0) {
gets(buffer);
strcpy(ptr[i].name, buffer);
}
/*gets(buffer);
strcpy(ptr[i].name, buffer);*/
gets(buffer);
strcpy(ptr[i].address, buffer);
gets(buffer);
strcat(ptr[i].address, " ");
strcat(ptr[i].address, buffer);
gets(buffer);
ptr[i].zip = atoi(buffer);
printf("Printing data for line %d...\n", i);
printf("name is: %s\naddress is: %s\nzip is: %d\n", ptr[i].name, ptr[i].address, ptr[i].zip);
printf("\n");
i++;
}
}
出现了两个问题: 1. 当我打印时,它会打印多达 50 个条目,这只是我要求的空间量,但实际条目数要少得多。
2.它会正确打印除第 2 行之外的每个条目。(或下标 1)如果您好奇,这里是输入:https ://pastebin.com/Ph5wzFeF
这是前 3 个条目的输出:
Printing data for line 0...
name is: A1, A2
address is: 20294 Lorenzana Dr Woodland Hills, CA
zip is: 91364
Printing data for line 1...
name is: B1, name is: B1, name is: B1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1, name is: B1, nam
address is: 1, name is: B1, name is: B1,
zip is: 94023
Printing data for line 2...
name is: C1, C2
address is: 5142 Dumont Pl Azusa, CA
zip is: 91112
调试一直很痛苦,因为我不能同时使用 i/o 重定向和 Visual Studio 调试器。如果有人对我如何调试有任何建议,我将不胜感激!但除此之外,我想要一些关于我所拥有的反馈。
解决方案
推荐阅读
- r - 在 Rmarkdown 文本中使用变量
- java - 是否假定开发人员应该在 JavaFX 中实现自己的 XXXProperties?
- android - Android:通过 WindowManager 添加的请求焦点视图 (WebView)
- api - 考虑在你的配置中定义一个“javax.servlet.ServletContext”类型的bean
- javascript - D3.js v4+ - 如何在强制布局中确定特定位置
- c - 显然声明的变量被认为是未声明的
- java - 为 9999 年 12 月 31 日(UTC)创建 java.sql.Date 的最简单方法?
- python - Tkinter 模块 - 程序将运行然后停止并且不会打开窗口
- java - JUnit 5 中的系统属性和并行测试执行
- javascript - 毫不拖延,“更新”不会触发