Основная ошибка ввода / вывода C ++ - PullRequest
4 голосов
/ 06 декабря 2011

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

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

int main ()
{
        string STRING ="";
        string list[10000];
        int i = 0;
    ifstream infile;
    infile.open ("C:/Users/Ryan/Desktop/data.txt");
      ofstream myfile;
  myfile.open ("C:/Users/Ryan/Desktop/data-2.txt");

        while(!infile.eof()) // To get you all the lines.
        {
            getline(infile,STRING);
            list[i]=STRING;
            myfile<<list[i];
            ++i;
        }


    infile.close();
  myfile.close();

  return 0;
}

По какой-то причине, несмотря на это, каждая вторая строка дает мне кучу забавных китайских символов. Вот мой data.txt ...

BPC 20101206    V   0.13    0.13    0.13    0
BPC 20101207    V   0.13    0.13    0.13    6500
BPC 20101208    V   0.13    0.13    0.13    0
BPC 20101209    V   0.13    0.125   0.125   117000
BPC 20101210    V   0.125   0.125   0.125   0
BPC 20101213    V   0.125   0.125   0.125   0
BPC 20101214    V   0.13    0.13    0.13    5000
BPC 20101215    V   0.13    0.13    0.13    290
BPC 20101216    V   0.125   0.115   0.115   24000

А вот и выходные данные-2.txt ...

BPC 20101206    V   0.13    0.13    0.13    0
䈀倀䌀ऀ㈀ ㄀ ㄀㈀ 㜀ऀ嘀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ㘀㔀  ഀ BPC 20101208    V   0.13    0.13    0.13    0
䈀倀䌀ऀ㈀ ㄀ ㄀㈀ 㤀ऀ嘀ऀ ⸀㄀㌀ऀ ⸀㄀㈀㔀ऀ ⸀㄀㈀㔀ऀ㄀㄀㜀   ഀ BPC 20101210    V   0.125   0.125   0.125   0
䈀倀䌀ऀ㈀ ㄀ ㄀㈀㄀㌀ऀ嘀ऀ ⸀㄀㈀㔀ऀ ⸀㄀㈀㔀ऀ ⸀㄀㈀㔀ऀ ഀ BPC 20101214    V   0.13    0.13    0.13    5000
䈀倀䌀ऀ㈀ ㄀ ㄀㈀㄀㔀ऀ嘀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ ⸀㄀㌀ऀ㈀㤀 ഀ BPC  20101216    V   0.125   0.115   0.115   24000

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 06 декабря 2011

Чтобы решить исходную проблему, похоже, что вы выводите неформатированные символы (например, китайские).Я не вижу, как вы вставляете новые строки (хотя в выводе, похоже, есть новые строки), поэтому в вашем коде чего-то не хватает, что вы нам не показываете. Пожалуйста, вырежьте / вставьте РЕАЛЬНЫЙ код .

  1. Что такое настоящий код.
  2. Как вы генерируете выходные данные из файлов (это был кот, который вы открывали?это в редакторе)?

Главное, на что нужно обратить внимание:

Никогда еще не делали этого:

   while(!infile.eof())

Вы должны прочитать и проверить строку перед использованиемit.
Это можно сделать в одной строке, поместив чтение в условие:

    while(getline(infile,STRING))
    {
        list[i]=STRING;
        myfile<<list[i];
        ++i;
    }

Другие вещи, на которые нужно обратить внимание:

  1. Отформатируйте ваш код красиво!!!!!!
  2. Не используйте все идентификаторы заглавных букв (обычно они зарезервированы для макросов).
  3. Не используйте массивы.Вместо этого используйте std :: vector.
  4. Объявите и откройте файл в одну строку

    ifstream infile("C:/Users/Ryan/Desktop/data.txt");
    
  5. Не проверяйте EOF как условие цикла.

    • Это может вызвать бесконечный цикл, если есть другая проблема.
    • Если вы не проверяете прочитанное, то вы повторяете обработку последней строки.
  6. Не закрывайте файл вручную (пусть деструктор сделает это)

3 голосов
/ 06 декабря 2011

Если я не ошибаюсь, ваша ОС - Windows?

Причина этих "китайских" символов в том, что ваш файл .txt закодирован в Unicode.Откройте его в блокноте, нажмите «Сохранить как» и в раскрывающемся списке «Кодировка» (где-то внизу диалогового окна) выберите «ANSI», затем сохраните.Это должно решить "китайскую" проблему:)

Проверьте другие ответы, чтобы исправить проблемы с вашим кодом.Надеюсь, это поможет.

1 голос
/ 06 декабря 2011

Вот хорошая статья, детализирующая альтернативы while (! Eof) ... здесь

1 голос
/ 06 декабря 2011

когда вы записываете данные, вы не включаете символ новой строки, поэтому вы не создаете дубликат файла, если это было вашим намерением.

кажется, что нет никакой причины иметь массив List [], посколькузаписав его обратно напрямую, вместо этого вы могли бы сделать

getline(infile,STRING);
myfile << STRING << endl;  

btw STRING не является хорошим именем переменной, выберите что-то более описательное.

...