Проблемы с сохранением символа в файле - PullRequest
0 голосов
/ 10 февраля 2011

Эй.У меня проблемы с записью char в файл с ofstream.Вот как выглядит код (просто чтобы показать, как он работает. Это НЕ настоящий код).

char buffer[5001];
char secondbuffer[5001];
char temp;
ifstream in(Filename here);
int i = 0;
while(in.get(secondbuffer) && !in.eof[])
{
i++;
}
for(int j = 0; j < i; j++)
{
secondbuffer[j] = buffer[j];
}
ofstream fout(somefile);
fout << secondbuffer;

// end of program 

Проблема в том, что он хорошо читает символы первого файла, но когда пишет ввторой файл, он добавляет все символы из первого файла, как и положено, но когда символов больше нет, он добавляет много символов «Ì» в конец файла.

fx:

файл 1: abc

файл 2: abcÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ...

Как запретить сохранение программы "Ì"в файле?

EDIT2:

int i = 0;
    lenghtofFile++;
    while(fin.get(firstfileBuffer[i]) && !fin.eof())
    {
        i++;
        lenghtofFile++;
    }
    firstfileBuffer[i] = '\0';

    for(int j = 0; j < lenghtofFile; j++)
    {

        if(secondfileBuffer[j] != ' ' && secondfileBuffer[j] != '\0')
        {
        secondfileBuffer[j] = function(key, firstfileBuffer[j]);
        }

    }

    secondfileBuffer[lenghtofFile]='\0';

    fout << secondfileBuffer;

Ответы [ 3 ]

0 голосов
/ 10 февраля 2011

Проблема в том, что в вашем файле нет завершающего нулевого символа. Когда вы читаете файл в, вы получаете «abc» просто отлично, но мусор, который находился во втором буфере, когда он был объявлен, все еще там, поэтому запись «abc» в начало означает, что у вас есть массив длиной 5001 мусора, который начинается с "abc."

Попробуйте добавить

secondbuffer[i] = '\0'; после вашего цикла for.

0 голосов
/ 10 февраля 2011

Это должно работать нормально:

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
  char buffer[5001];
  char secondbuffer[5001];
  ifstream in("foo.txt", ifstream::in);
  ofstream fout("blah_copy.txt");
  do
    {
      in.getline(buffer,5001);
      fout<<buffer;
    }
  while(!in.eof());
  in.close();
  fout.close();
  return 0;
}
0 голосов
/ 10 февраля 2011

Вам нужно завершить нулевой второй буфер. Вы добавляете все символы, прочитанные из потока, которые не включают завершающий NULL.

в строке до fout, добавьте

secondbuffer[j]='\0\';
...