【问题标题】:Reading new line in C [duplicate]在C中读取新行[重复]
【发布时间】:2016-10-17 00:38:12
【问题描述】:

所以我目前正在尝试逐字符读取输入文件,并尝试查看何时出现新行。我得到所有字符都很好,但是如果我将它转换为 int,我得到的不是新行的 '\n' 或 -97。这是我的代码,我使用的是 VS 2015。

int main(void) {
    FILE *fp;
    fp = open_input_file();
    if (fp != 0) {
        char ch = read_character(fp);
        int d = (int)ch;
        while (ch != EOF) {
            printf("%d\n", d);
            ch = read_character(fp);
            d = (int)ch;
        }
    }
    getch();
    return 0;
}
char read_character(FILE *infile) {

    int c;
    c = getc(infile);

    return (char) c;
}

【问题讨论】:

  • 你想问什么?你能说得清楚一点吗?
  • 您一直在与int 之间进行投射。只需坚持int,由getc 返回,函数类型也是如此。
  • 三思而后行,这可能意味着您需要在这里使用铸造锤:return (char) c;。 C 语言中的一般经验法则:如果您发现自己面临强制转换的需要,那么您要么是垃圾,要么是聪明人。通常你只需要在非常罕见的情况下施放。
  • getc() 有意返回 int。只是不要忽略这一点。
  • 1) 确保在main() 中使用之前声明/定义char read_character(FILE *infile)。 2)发布输入文件的内容。 3) 发布输出可见

标签: c file input


【解决方案1】:

您可以检测到对现有代码进行微小更改的换行符:

int main(void) {
    FILE *fp;
    fp = open_input_file();
    if (fp != 0) {
        int ch = read_character(fp);//change to int return (getc() returns int)
        if(ch == '\n') //A simple comparison here will detect newline
        {
            printf("Found Newline: %d\n", ch);
        }
        ///int d = (int)ch;// not necessary with current changes
        while (ch != EOF) {
            //printf("%d\n", d);
            ch = read_character(fp);
            if(ch == '\n')//Note: ASCII for \n is value 10, or hex A
            {
                printf("Found newline: %d\n", ch);
            }

            //d = (int)ch;
        }
    }
    getch();
    return 0;
}

int read_character(FILE *infile) 
{  //changed prototype to return int

    int c;
    c = getc(infile);

    return c;//modified return value to int
}

【讨论】:

  • 有了这些改变,就不需要get_character函数了,它和getc是一样的。
  • 这里的演员 int d = (int)ch; 没用。
  • @Barmer - 是的。不知道这里是否有更多价值需要改变,或者让 OP 去做。
  • @alk - 同意,您指的是评论,对吧?它是 OP 原始代码的一部分。我离开是为了对比变化。
  • 我指的是你显示的代码。
猜你喜欢
  • 2023-03-19
  • 2023-03-27
  • 2015-05-19
  • 2020-02-21
  • 1970-01-01
  • 2011-07-19
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多