Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言读写文件_C_File_Parsing_Scanf - Fatal编程技术网

用C语言读写文件

用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

我陷入了C语言中一些基本的文件处理代码中。基本上,我想解析一个输入文件以获取一些信息,然后将其放入另一个文件中(更多信息在输入文件中)。我使用了一个在线gcc编译器,一切都很好。当我
在这里输入代码时
用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);