2015-04-07 8 views
0

У меня возникла проблема с использованием строк. Поэтому у меня возникла идея написать программу, которая умножает две скобки, так как у меня было по 10 переменных. Я помещал скобки в .txt-файл и хотел прочитать его и просто распечатать в другой .txt-файл. Я не уверен, что у него есть проблемы с конкретными знаками. Так вот мой TXT, что я прочиталиспользование строки с текстовыми файлами c/C++

2 * x_P * X_n - x_P^2 + d_P - 2 * X_n * x_Q + x_Q^2 - d_Q

и вот что он на самом деле печатает

2 * х _-- x_P^++ d_P-2 * х _ ++ x_Q^-

, как Вы можете видеть, что это совершенно неправильно. Кроме того, я получаю сообщение об ошибке после выполнения, но он все равно печатает его в .txt. Так вот мой код:

#include <stdio.h> 
#include <string> 
using namespace std; 
int main() 
{ 
    int i; 
    const int size = 11; 
    string array[ size ]; 
    FILE * file_read; 
    file_read = fopen("alt.txt", "r"); 
    for(i = 0; i < size; i++) //Read 
    { 
     fscanf(file_read, "%s", &array[ i ]); 
    } 
    fclose(file_read); 
    FILE * file_write; 
    file_write = fopen("neu.txt", "w"); 
    for(i = 0; i < size; i++) //Write 
    { 
     fprintf(file_write, "%s", &array[ i ]); 
    } 
    fclose(file_write); printf("test"); 

    return 1; 
} 

Спасибо за предложения. Вы также можете вносить предложения, сделанные с помощью iostream.

+0

Вы только что скопировали файл? Попробуйте http://stackoverflow.com/questions/10195343/copy-a-file-in-an-sane-safe-and-efficient-way –

ответ

2

Вы смешиваете C++ и C формы входного файла:

Когда вы пишете:

fscanf(file_read, "%s", &array[ i ]); 

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

К сожалению, вы предоставляете указатель на строку C++. Таким образом, это приведет к неопределенному поведению (скорее всего, к повреждению памяти).

Решение 1

Если вы хотите продолжать использовать C standard library file i/o, вы должны использовать промежуточный буфер:

char mystring[1024];  //for storing the C string 
... 
     fscanf(file_read, "%1023s", mystring); 
     array[ i ] = string(mystring); // now make it a C++ string 

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

Решение 2

Если вы узнаете, C++ (если смотреть на теге C++ и заголовка строки), я сильно бы предположить, что вы посмотрите на fstream в библиотеке C++. Он разработан, чтобы хорошо работать со струнами.

Вот как это может выглядеть следующим образом:

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

int main() 
{ 
    const int size = 11; 
    string array[ size ]; 
    ifstream file_read("alt.txt"); 
    for(int i = 0; i < size && file_read >> array[ i ]; i++) //Read 
     ; 
    file_read.close(); 
    ofstream file_write("neu.txt"); 
    for(int i = 0; i < size; i++) //Write 
     file_write << array[ i ] <<" "; // with space separator 
    file_write.close(); 
    cout << "test"<<endl; 

    return 0; 
} 

И конечно, следующая вещь, которую вы должны рассмотреть, было бы заменить классические массивы с векторами (вы не должны определять их размер заранее) ,

+0

Итак, вы предлагаете работать с char? – FrontMobe

+0

@FrontMobe Если вы хотите использовать scanf(), вы должны использовать массив символов.Но я бы больше рекомендовал использовать строки с потоками C++. – Christophe

+0

Ну, в первую очередь, спасибо за подробный ответ. Я изучил c в школе и только что получил некоторые уроки C++ в Интернете. Поэтому я борется с синтаксисом. Можете ли вы объяснить мне это 'for (int i = 0; i <размер && file_read >> array [i]; i ++) // Чтение' Поскольку вы ничего не делаете в этом цикле (я не могу видеть, где), и если бы я хотел сохранить каждую вторую строку как другую переменную. Чтобы сделать 1-ю переменную, тогда a + - * /. Как я могу сделать это с помощью этого цикла? Сделал бы с i% 2 == 0. Но что положить в петлю? Еще раз спасибо – FrontMobe

Смежные вопросы