字符串在文本文件中的用法 c/c++
string usage with textfiles c/c++
我在使用字符串时遇到问题。所以我有了编写一个程序的想法,它将两个括号相乘,因为我有一些每个括号有 10 个变量。我在 .txt 文件中放了一个括号,想读取它并打印到另一个 .txt 文件中。我不确定它是否对特定标志有问题。
所以这是我阅读的 txt
2*x_P*x_N - x_P^2 + d_P - 2*x_N*x_Q + x_Q^2 - d_Q
这是它实际打印的内容
2*x_--x_P^++d_P-2*x_++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 提出的建议。
您正在混合使用 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++ 标记和字符串 header),我强烈建议您查看 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;
}
当然,接下来您应该考虑的是用向量替换经典数组(您不必提前定义它们的大小)。
我在使用字符串时遇到问题。所以我有了编写一个程序的想法,它将两个括号相乘,因为我有一些每个括号有 10 个变量。我在 .txt 文件中放了一个括号,想读取它并打印到另一个 .txt 文件中。我不确定它是否对特定标志有问题。 所以这是我阅读的 txt
2*x_P*x_N - x_P^2 + d_P - 2*x_N*x_Q + x_Q^2 - d_Q
这是它实际打印的内容
2*x_--x_P^++d_P-2*x_++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 提出的建议。
您正在混合使用 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++ 标记和字符串 header),我强烈建议您查看 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;
}
当然,接下来您应该考虑的是用向量替换经典数组(您不必提前定义它们的大小)。