- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
该程序要求用户在必要时输入一些记录(结构)并将它们 append 到现有文件或如果没有则创建一个新文件,然后列出文件的内容。
#include <stdio.h>
#include <string.h>
#define N 25
int main() {
struct studrec {
char name[20], surname[20], sex, date[12];
} students[N];
int i, count = 0;
char another;
FILE *fileptr;
for (i = 0; i < 10; i++) {
puts("Press y to continue without adding new records");
another = getchar();
if (another == 'y' || another == 'Y') break;
while ((another = getchar()) != '\n' && another != EOF);
puts("Input info");
puts("Name: ");
if (fgets(students[i].name, sizeof(students[i].name), stdin) == NULL) return 1;
students[i].name[strlen(students[i].name)-1] = '\0';
puts("Surname: ");
if (fgets(students[i].surname, sizeof(students[i].surname), stdin) == NULL) return 1;
students[i].surname[strlen(students[i].surname)-1] = '\0';
puts("Sex (m/f): ");
students[i].sex = getchar();
while ((another = getchar()) != '\n' && another != EOF);
puts("Date (dd.mm.yyyy): ");
if (fgets(students[i].date, sizeof(students[i].date), stdin) == NULL) return 1;
students[i].date[strlen(students[i].date)-1] = '\0';
while ((another = getchar()) != '\n' && another != EOF);
}
count = i;
fileptr = fopen("students.txt", "a+");
for (i = 0; i < count; i++) fwrite(&students, sizeof(students), 1, fileptr);
rewind(fileptr);
for (i = 0; (another = fgetc(fileptr)) != EOF && i < N; i++) {
fseek(fileptr, -1, SEEK_CUR);
fread(&students, sizeof(students), 1, fileptr);
}
fclose(fileptr);
count = i;
for (i = 0; i < count; i++) printf("%20s%20s%4c%15s\n", students[i].name, students[i].surname, students[i].sex, students[i].date);
return 0;
}
写入新文件时一切正常。输出:
...input procedure...
Press y to continue without adding new records
y
Liam James m 12.03.1987
Abbey Trueman f 23.07.1943
Hugo Brown m 13.05.1947
但是如果我再次运行它并尝试将另一条记录 append 到现有文件,程序将失败:
...input procedure...
Press y to continue without adding new records
y
Nadia Rachmonoff f 12.07.1934
O|u
�u � u
� E�u
似乎新记录放在了students[0]中,其他所有元素都被删除了。我究竟做错了什么?也许 &students 指针有问题。我尝试使用 &students[i] 但它在第一次迭代后返回“段错误”。据我了解, &students 地址在每次 fread/fwrite 后“自动”递增到下一个元素。否则程序将无法在第一次运行时正常运行。
最佳答案
您在处理数组的方式上遇到了一些问题。首先,这一行:
for (i = 0; i < count; i++) fwrite(&students, sizeof(students), 1, fileptr);
你在这里做的是运行一个循环,每输入一条记录一次,每次都将包含 25 个项目的整个数组写入文件。所以如果输入了 3 条记录,你写的是 75,其中大部分是垃圾或多余的。您在这里可能想要的更像这样:
for (i = 0; i < count; i++)
fwrite(&students[i], sizeof(students[i]), 1, fileptr);
...其中大小是数组(单个记录)的一个元素的大小,地址是您当前正在写入的记录的地址,而不是整个数组。
你在后面读取数据的时候也有类似的问题,除此之外:
rewind(fileptr);
for (i = 0; (another = fgetc(fileptr)) != EOF && i < N; i++) {
fseek(fileptr, -1, SEEK_CUR);
fread(&students, sizeof(students), 1, fileptr);
}
首先,fread(&students, sizeof(students), 1, fileptr);
应该像之前的 fwrite()
一样更改为 fread (&students[i], sizeof(students[i]), 1, fileptr);
.原因是一样的:你在一个循环中一次读取一条记录,所以你需要读入那个项目,而不仅仅是每次到数组的开头,以及数据量您读取的应该是那条记录 的大小,而不是整个数组的大小。
其次,虽然修复上面的问题应该可以让它工作,但您可以轻松更改循环,这样您就不需要读取循环表达式中的单个 char
来检查 EOF。您应该通过检查循环中 fread()
的返回来真正检查这一点。像这样的东西:
rewind(fileptr);
for (i = 0; i < N; i++) {
if (fread(&students[i], sizeof(students[i]), 1, fileptr) != 1)
break;
}
或者更好的是,只读取 N
项而不用循环,并使用返回值告诉您读取了多少:
rewind(fileptr);
i = fread(students, sizeof(students[0]), N, fileptr);
关于c - append 到 C 中的文件,读取到结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371014/
Racket 的 pict , 有几个 combinators for combining other pictures .这些文档包含一个很好的表格,说明其 *-append 组合器的工作方式: 这
我看过 Insert content into iFrame和他们的 fiddle http://jsfiddle.net/8VP4y/3/提出以下我遇到问题的代码。 我已经为下面的问题创建了一个 j
我有一个显示非常奇怪结果的微基准: @BenchmarkMode(Mode.Throughput) @Fork(1) @State(Scope.Thread) @Warmup(iterations =
我想知道是否有人可以回答我使用 StringBuilder 对象在 java 中执行这些语句中的哪一个会更好: 使用 .append(string1 + string 2) 对比 .append(st
假设我有两个相同类型的流。是否可以将一个流 append 到另一个流而无需事先将它们转换为列表? 例子: Stream ms = ...; Stream ns = ...; return ms.app
我有以下有效的 jQuery 代码,但它让我思考是否可以对正在 append 的内容执行 append 操作,而无需指定我想要 append 的内容。 append().append() 并没有达到目
这是为了显示诊断页面的检查。我有一个 .append(not_ok) 但当 swf 文件加载 100% 时,我想删除 not_ok 附加,然后添加一个 .append(ok)。 function ca
x = [[1,2],[2,3],[10,1],[10,10]] def duplicatingRows(x, l): severity = x[l][1] if severity =
我有一个列表,我正在尝试将数据注入(inject)其中。列表如下所示 data2 = ['TECH2_HELP', 'TECH2_1507', 'TECH2_1189', 'TECH2_4081',
为了有效地进行一些 DOM 操作,我分离了一个元素。在这个过程中,我遇到了一个有趣的情况: var $holder = $("#d"); var $wrapper = $("").css("borde
我遇到了图片在移动设备上加载速度不够快的问题。我的元素有一个图像和一个按钮。单击该按钮时,图像向下滑动,另一幅图像从顶部滑动以取代它。这是代码 html CSS .moveF
我正在编写一个包含 10 个遗愿 list 的简单哈希表。使用内置的 hash() 计算索引,然后对表大小取模。但是,当我尝试将该对象 append 到该索引处的存储桶列表时,它会 append 到每
我是 LISP 的新手,我正在尝试处理类的 cond 语句。目前,我正在尝试检查传递的值是否为列表,如果是,则将字母 d append 到列表中。 这是我的代码: (defun test(L) (li
我正在使用 Jquery 将数据 append 到 div。但是,append 语句之后页面上没有显示任何内容。 我尝试使用 $(window).load 来确保页面已加载,但这仍然不起作用。 HTM
我有以下代码; function SetupDropdowns() { var PrevType; dropdown1 = document.getElemen
我想在 smarty 中创建一个数组并在其中执行 append 功能!就像我在 smarty 模板中声明一个变量(如 {assign var=sizearr value=''} )然后我想在循环中向其
请考虑以下代码片段: var ul = $(".list_b").find("li").remove().end(); $.each(Sites, functi
我的日志记录配置中有两个 appenders。其中之一在 ERROR 事件上发送电子邮件。 一个类,我无法控制,垃圾邮件 ERROR 消息。所以我仍然想要那些消息,但不是在两个 appenders 中
我正在尝试制作 editText,我要在其中插入一些文本。在每三个字符之后,我想插入破折号。 例子: 类型:123 结果:123- 现在当光标在破折号后面并且你按下删除键时,我想删除破折号和破折号
当我尝试 append 简单的“hello”时,它会被 append ,但很快就会自动删除。仅当我在下面给出的表单中使用它时,才会出现此问题,如果删除该表单,则不会出现问题,并且 hello 会正确
我是一名优秀的程序员,十分优秀!