在C中读取文件的两难选择

时间:2015-03-20 11:10:37

标签: c

这是我的第一个问题,所以我希望你们能提供帮助。在课堂上,我的任务是编写一个C代码,从1个文件中读取一组字符串,然后将它们打印在另一个文件中,以及字符串中每个字符的ASCII代码,以及ASCII代码值的总和。下面的代码已编译,但未执行。代码是对的,但是我做错了,或者代码是错的。非常感谢。

注意:第一个文件从名为list的文本文件中读取,代码打印到名为list2的文本文档中。

#include <stdio.h>

int main(void)
{
    FILE *file1, *file2;

    file1 = fopen("list.txt", "r");

    if (file1==NULL)
    {
        puts(" File not exisiting\n");
    }

    file2 = fopen("list2.txt", "w");

    if (file2==NULL)
    {
        puts(" File could not open \n");
    }

    char a[5];
    fscanf(file1, "%s", a);
    int b,c;

    while (a[5]!=EOF)
    {
        for (int i=0;i<5;i++)
        {
        fprintf(file2, "%c", a[i]);
        b=a[i];
        fprintf(file2, "%d", b);

        c+=b;
        }
    }

    fprintf(file2, "%d", c);
    return 0;



}

2 个答案:

答案 0 :(得分:2)

第1点。使用

之类的定义
char a[5];
使用

while (a[5]!=EOF)

调用undefined behaviour。 你面临着一个一个错误。请记住,c中的数组索引从0开始。有效访问最多为a[4]


第2点。 fscanf(file1, "%s", a);不安全。它可能导致缓冲区溢出。至少,你需要写

 if ( fscanf(file1, "%4s", a) != 1)
 {
         //scanning not successful, take necessary measures
 }
 //otherwise, continue nomal execution.

第3点。 while循环的逻辑不正确。那里没有break条件。


第4点。 c+=b;,此处c未经初始化使用。 read-before-write 方案。再次,undefined behaviour。请记住,auto局部变量不会自动初始化为0或某个值。你必须明确初始化。


第5点。如果if (file1==NULL)条件满足,则不要继续正常执行。仅打印消息是不够的。您应该停止使用该计划,并避免使用file1file1等。


第5点的信用:user4402433

答案 1 :(得分:0)

return包含在文件检查中

if (file1==NULL)
{
    puts(" File not exisiting\n");
    return 0;
} 

因为如果打开任何一个文件,就不会继续使用代码。   同时在while之前初始化c=0;的值,以便可以避免任何垃圾值。

必须对数组a[]编制索引以更新文件内容。所以放置

fscanf(file1, "%s", a[i]); 

for()循环内。这是为了避免在极少数情况下发生缓冲区溢出。