2017-07-17 34 views
-4

我面临C++和C的问题,其中我的ifstream对象或文件指针不能正确读取文本文件,并在输出时显示非法字符。但是,当我读取.dat文件时,它会输出正确的结果。Turbo C++编译器没有正确读取文本文件。 (只有当我把它做成一个.dat文件时,它是否正确读取)

这是C代码:

#include <stdio.h> 
#include <conio.h> 
#include <ctype.h> 
void main() { 
    FILE *file; 
    char ch; 
    file = fopen("code.dat", "r"); 
    while((ch = getc(file)) != EOF) 
     printf("%c", ch); 
    getch(); 
    fclose(file); 
} 

这是CPP代码:

#include <fstream.h> 
#include <iostream.h> 
#include <conio.h> 
#include <string.h> 

int main() { 
    clrscr(); 
    fstream file; 
    file.open("code.dat", ios::in); 
    char ch, c; 
    char token[6]; 
    int id = 0, op = 0, key = 0; 
    while (!file.eof()) { 
     file >> ch; 
     if(ch == ' ') { 
      if ((ch > 64 && ch < 91) || (ch > 96 && ch < 123)) 
       id += 1; 
     } 
    } 

    cout << id; 
    file.close(); 
    getch(); 
    return 0; 
} 
+5

Turbo C++是一个古老的编译器,已停止支持。它在语言标准化之前使用C++方言。如果你想学习C++,它的用法就是升级到现代。 GCC和Clang是不错的选择。 – StoryTeller

+2

“我正面临C++和C的问题,我的ifstream对象在哪里” - 您不知道。 C没有“ifstream对象”。这是一种完全不同的语言! – Olaf

+0

[为什么不用Turbo C++编译简单的“Hello World”风格的程序?](https://stackoverflow.com/questions/44863062/why-doesnt-a-simple-hello-world-style -program-compile-with-turbo-c) –

回答

0

由于您遇到了文本文件的问题,请尝试以二进制模式打开它,即:添加ios :: binary。因此代码变为:

file.open("code.txt",ios::in|ios::binary); 

也文件>> ch用于当您要读取整个单词时。由于您想逐字阅读字符,请尝试使用

file.get(ch); 
0

一个潜在的问题可能是代码:

if(ch == ' ') 
{ 
    if((ch > 64 && ch < 91) || (ch > 96 && ch < 123)) 
     id += 1; 
} 

if声明排除执行内部if语句的可能性(ASCII代码为as速度是32,所以ch不能同时满足这两个条件中的一个,所以id从不增加)。

这看起来好像不会产生您所描述的行为,但应该只会导致将0打印到stdout

如果没有输出示例,很难知道发生了什么问题 - 我们需要一个MCVe来提供很好的建议。在这里,你的C代码只是打印文件的内容,而C++代码则计算字母字符的数量(也许我只是略过了它)。那么哪一个失败?如何?给我们一个的例子,输出,和澄清你期望的每个人做什么。正如其他人所提到的,Turbo C++已经过时 - 您应该开始使用g ++或clang来代替。

+0

对不起,其实代码是,如果(ch!='')... –

相关问题