我编写了一段代码来读取文本文件foo.txt,格式为:
1
2
3
4
它存储最后一个数字并递增它并将其写回。这是我存储最后一个数字的部分,代码的下一部分是将数字写入文件。该文件由./readfile 100 foo.txt
调用,其中100是必须递增最后一个数字的次数。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE *fp;
char ch[100];
int i = 0;
int j = 0;
int count = atoi(argv[1]);
while (count != 0) {
fp = fopen(argv[2], "r");
while (fp) {
ch[i] = fgetc(fp);
i++;
j = i;
printf("%d", j);
}
fclose(fp);
count--;
}
return 0;
}
答案 0 :(得分:1)
你的问题是:
while (fp)
对于布尔测试,FILE*
只是另一个指针。因此,只要它成功打开,该测试总是通过。你一直在读取字符,存储到数组的连续元素中,直到你溢出,最终完全写入未分配的内存(或巧合地重写一些重要的东西并以其他方式导致崩溃)。
你真的想要这样的东西:
// Must read into int; EOF itself is not a char value
int inchar;
// Read and test for EOF
while((inchar = fgetc(fp)) != EOF)
{
ch[i] = inchar; // Store
i++;
printf("%d", inchar); // Print raw value returned by fgetc
}
答案 1 :(得分:1)
修复&#34; while(fp)&#34;问题。你仍然有ch [i]的问题。使用您的代码,&#34;我&#34;将增加到400.因此发生分段错误。
while(fp)
{
ch[i] = fgetc(fp);
i++;
j = i;
printf("%d", j);
}