gpt4 book ai didi

c++ - 从文件中读取单个字符返回特殊字符?

转载 作者:行者123 更新时间:2023-11-30 05:39:44 26 4
gpt4 key购买 nike

我试图使用 fstreams 从文件中的指定位置读取单个字符并将它们附加到字符串中。出于某种原因,读入这些字符会返回特殊字符。我已经尝试了很多事情,但我在调试时发现的更奇怪的事情是更改 char temp; 的初始值将导致整个字符串更改为该值。

int Class::numbers(int number, string& buffer) {
char temp;

if (number < 0 || buffer.length() > size) {
exit(0);
}

string fname = name + ".txt";
int start = number * size;

ifstream readin(fname.c_str());
readin.open(fname.c_str(), ios::in)
readin.seekg(start);

for (int i = 0; i < size; ++i) {
readin.get(temp);
buffer += temp;
}

cout << buffer << endl;
readin.close();
return 0;
}

这是输出特殊字符的示例屏幕截图:http://i.imgur.com/6HCI7TT.png

问题可能出在我开始使用 seekg 的地方吗?它似乎在适当的位置开始。我考虑过的另一件事是,也许我正在将一些无效的地方读入流中,它只是给我内存中的垃圾字符。

有什么想法吗?

可行的解决方案:

int Class::numbers(int number, string& buffer) {
char temp;

if (number < 0 || buffer.length() > size) {
exit(0);
}

string fname = name + ".txt";
int start = number * size;

ifstream readin(fname.c_str());
readin.open(fname.c_str(), ios::in)
readin.seekg(start);

for (int i = 0; i < size; ++i) {
readin.get(temp);
buffer += temp;
}

cout << buffer << endl;
readin.close();
return 0;
}

这是有效的解决方案。在我的程序中我已经打开了这个文件名,所以我想打开它两次可能会导致问题。我将在自己的时间对此做一些进一步的测试。

最佳答案

For ASCII characters with a numeric value大于 127,屏幕上呈现的实际字符取决于 code page of the system you are currently using .

可能发生的情况是您没有像您认为的那样得到一个“字符”。

首先,要对此进行调试,请使用您现有的代码打开并打印出整个文本文件。您的程序能够做到这一点吗?如果不是,则您打开的“文本”文件可能不是使用 ASCII,而是可能是 UTF 或其他某种编码形式。这意味着当您读取一个“字符”(最有可能是 8 位)时,您只是在读取一个 16 位“宽字符”的一半,结果对您来说毫无意义。

例如,gedit 应用程序将按照我的预期自动在屏幕上呈现“Hello World”,而不管字符编码如何。但是,在十六进制编辑器中,UTF8 编码的文件如下所示:

UTF8 原始文本:

0000000: 4865 6c6c 6f20 776f 726c 642e 0a         Hello world..

虽然 UTF16 看起来像:

0000000: fffe 4800 6500 6c00 6c00 6f00 2000 7700  ..H.e.l.l.o. .w.
0000010: 6f00 7200 6c00 6400 2e00 0a00 o.r.l.d.....

这就是您的程序所看到的。 C/C++ 默认使用 ASCII 编码。如果您想处理其他编码,则由您的程序手动或使用第三方库来适应它。

Also, you aren't testing to see if you've exceeded the length of the file .你可能只是随便抓垃圾。

使用一个仅包含字符串“Hello World”的简单文本文件,您的程序可以这样做吗:


代码 list


// read a file into memory
#include <iostream> // std::cout
#include <fstream> // std::ifstream
#include <string.h>

int main () {
std::ifstream is ("test.txt", std::ifstream::binary);
if (is) {
// get length of file:
is.seekg (0, is.end);
int length = is.tellg();
is.seekg (0, is.beg);

// allocate memory:
char * buffer = new char [length];

// read data as a block:
is.read (buffer,length);
// print content:
std::cout.write (buffer,length);
std::cout << std::endl;

// repeat at arbitrary locations:
for (int i = 0; i < length; i++ )
{
memset(buffer, 0x00, length);
is.seekg (i, is.beg);
is.read(buffer, length-i);
// print content:
std::cout.write (buffer,length);
std::cout << std::endl;
}

is.close();
delete[] buffer;
}

return 0;
}

示例输出


Hello World

Hello World

ello World

llo World

lo World

o World

World

World

orld

rld

ld

d

关于c++ - 从文件中读取单个字符返回特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com