【问题标题】:Reading text file in C用C读取文本文件
【发布时间】:2014-09-03 16:50:35
【问题描述】:

我的教授给了我们从文本文件中获取输入的代码。问题是它不会为我正确编译。我不确定他(或我)哪里出错了。我没有以任何方式修改他的代码,并且我的txt文件与代码在同一目录中。

#include <stdio.h>
#include <stdlib.h>


int main()
{
     FILE *fp;
     char ch;
     fp = fopen("IronHeelShort.txt", "r");
     printf("Data inside file : ");
     while(1)
     {
         ch = fgetc(fp);
         printf("%c", ch);
         if (ch == EOF)
         break;

     }
     getch();
}

【问题讨论】:

  • 那么错误信息是什么
  • 您应该检查文件是否打开。 ch 应该是 int。您应该检查ch 是否为EOF 打印ch。你的教授是个白痴。您使用的是什么编译器/操作系统?
  • “不会编译” 没有任何意义。您的编译器显示的错误消息是什么?肯定是因为getch() 而怪你?这应该会给你一个提示:programmingsimplified.com/c/conio.h/getch
  • 警告:函数“getch”的隐式声明。对 getch 的未定义引用。 ld 返回 1 个退出状态。

标签: c file-io fopen textinput getch


【解决方案1】:

ch无论如何都应该是int 函数fgetc() 将始终返回一个int,以处理所有字符值和EOF,它是负数。 在这里找到字符0xFF时,读取文件会提前结束。

编译问题,把getch()改成getchar()

【讨论】:

  • 谢谢 :) 我已经完成了编辑。但是你能告诉我为什么 EOF 没有被定义为-1。来自我的 stdio.h 文件:#define EOF (-1)
  • 在将 ch 更改为 int 并将 getch() 更改为 getchar() 之后。运行后出现分段错误(核心转储)?
  • @ValentinMercier “来自我的 stdio.h 文件”与“在标准中定义”不同。我正在抱怨在我大学的 C++ 教科书中发现的这种草率(他们断言 wchar_t 被定义为 unsigned short,它可能是也可能不是。) - 无论如何,+1。
  • @user1798299 段错误只能是由于无法打开您的文件。请确认它存在并且在您的程序旁边。
  • @mafso 我说“草率”正是因为它坚持某个平台,这导致学生只接触到部分真相。这就是我所说的“草率”,但也许这不是正确的表达方式(我不是以英语为母语的人)。
【解决方案2】:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
    FILE *fp;
    char ch;
    fp = fopen("C:/emule/c/0.html", "r");
    printf("Data inside file : ");
    while (1)
    {
        ch = fgetc(fp);
        printf("%c", ch);
        if (ch == EOF)
            break;

    }
    _getch();
}

更新

#include <stdio.h>
#include <stdlib.h>

void main() {
    FILE *input = NULL;
    char c;

    input = fopen("D:/c/text.txt", "rt");
    if (input == NULL) {
        printf("Error opening file");
        scanf("1");
        exit(0);
    }
    while (fscanf(input, "%c", &c) == 1) {
        fprintf(stdout, "%c", c);
    }

    fclose(input);
    scanf("1");
}

【讨论】:

  • 如果你告诉他他的代码有什么问题会更好。这个人可能会学到一些东西。
  • 当你使用 getch 我想它是 VSE。 fopen 和 getch 现在不会因为不安全而工作。使用 _getch 和 _CRT_SECURE_NO_WARNINGS 进行编译。除此之外,检查 EOF 是个坏主意,因为它没有在标准中定义。最好检查从文件中正确读取了多少字符。
  • 等一等比较好,我不是码农。
  • 所以你不使用 Windows)
  • 猴子或智人,最好花点时间准备一个完整的答案,然后再为投票吐一些东西
猜你喜欢
  • 2017-05-02
  • 1970-01-01
  • 2021-03-10
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多