用C语言读写文件
我陷入了C语言中一些基本的文件处理代码中。基本上,我想解析一个输入文件以获取一些信息,然后将其放入另一个文件中(更多信息在输入文件中)。我使用了一个在线gcc编译器,一切都很好。当我用C语言读写文件,c,file,parsing,scanf,C,File,Parsing,Scanf,我陷入了C语言中一些基本的文件处理代码中。基本上,我想解析一个输入文件以获取一些信息,然后将其放入另一个文件中(更多信息在输入文件中)。我使用了一个在线gcc编译器,一切都很好。当我在这里输入代码时用gcc命令在cmd中编译代码输出文件为空 #include <stdio.h> #include <string.h> int main() { char c[1000]; FILE *fptr,*resultfp; if ((fptr = fope
在这里输入代码时
用gcc命令在cmd中编译代码输出文件为空
#include <stdio.h>
#include <string.h>
int main() {
char c[1000];
FILE *fptr,*resultfp;
if ((fptr = fopen("inputfile.txt", "r")) == NULL) {
printf("can't be opened");
}
if ((resultfp = fopen("outputfile.txt", "w")) == NULL) {
printf("can't be opened");
}
while(strcmp(c,"END OF FILE")){
fscanf(fptr, "%[^\n]", c);
fseek(fptr, 1,SEEK_CUR);
if(strstr(c,"Example name") || strstr(c,"Example description") )
{
fscanf(fptr, "%[^\n]", c);
fprintf(resultfp,"%s\n", c);
}
}
fclose(fptr);
fclose(resultfp);
return 0;
}
首先,即使操作代码工作正常,输入文件也有问题。输入文件中第二个条件的实例都不会被读取或发布到输出文件中。i、 e代码中的搜索条件为:
"Example description"
但是inputfile.txt行是:
"Example descripton:"//mis-spelled
接下来,台词
char c[1000];
...
while(strcmp(c,"END OF FILE")){
…导致在初始化变量之前访问变量c
。这反过来又会导致。修复方法很简单,总是在第一次使用变量之前初始化它们:`char c[1000]={0}
还有,这条线
while(strcmp(c,"END OF FILE")){
将根据c
的内容产生不同的结果。了解
最后,这一行:
fseek(fptr, 1,SEEK_CUR);
与文本文件一起使用时,必须满足以下条件之一:
- 偏移量必须为零
- 偏移量是上一次调用ftell和origin返回的值 设置为文件的开头李>
1
值不符合上述任一标准
如果您愿意尝试一种更简单的读取/解析方法,那么使用while(fgets(…){…}
构造可以利用。以下循环直到找到指定的标记,然后读取文件中下一行的值。当看到时,它将退出循环。(注意,EOF是文本文件固有的,不需要输入文件.txt中的最后一行)
由于指定输入文件的方式,检查每一整行中的各种标记值对就足够了,而且很简单。在这种情况下,在单独的行中显示,此方法简化了每一对的解析和测试。您的程序有很多问题,但扼杀它的是一个事实,它假设换行符是一个字符
fseek(fptr, 1,SEEK_CUR);
将跳过
但在Windows上实际情况并非如此:为了兼容性起见,stdio库会将\r\n
转换为\n
,但fseek
只会跳过一个字节
如果你改成
fseek(fptr, 2,SEEK_CUR);
你的程序会工作的——对于“工作”的定义非常宽泛。你在阅读任何内容之前检查
c
的内容。内容将是不确定的,您可能有未定义的行为。我还建议您检查什么。最后,%[
格式说明符不会跳过前导空格。这意味着所有读取都将在第一行的换行处停止……并检查fscanf的返回值……并且在任何一个fopens失败后都不应该愉快地继续;您的程序可能会崩溃,然后才能清除没有新行终止的无法执行打开了
。我想你应该从头开始重新编写所有的程序;-)我试过了,但解析并不像预期的那样,我想这是因为c[]有一个固定值。@CatalinDiaconu-在您的输入文件示例描述符中使用了:
,但在您的代码示例描述中使用了:
。很好的说明,我会纠正这一点,我再试了一次,似乎while循环从未结束。我还收到以下警告:比较指针和整数while(fgets(c,sizeof(c),fptr)!=EOF)@CatalinDiaconu-我发布的代码在循环中运行,然后关闭文件,然后退出。如果所有其他操作都失败,请尝试直接从我的示例代码复制和粘贴它…我发现了问题,在这个文件中有许多制表符,如果我手动删除它们,它会工作。非常感谢您的帮助和宝贵的时间!
fseek(fptr, 1,SEEK_CUR);
fseek(fptr, 2,SEEK_CUR);