简体   繁体   English

在 C++ 中读取文本文件并将数据存储在二维数组中

[英]Reading a Text file and Storing data in 2D Array in C++

Basically, I'm reading a file and trying to store the data in a 2D, for the differentiation between rows and columns I use the logic below:基本上,我正在读取一个文件并尝试将数据存储在 2D 中,为了区分行和列,我使用以下逻辑:

    int rows=0,column=0;
    char arr[50][50];
    while(my_file.eof()==0){
        my_file.get(ch);
        if(ch=='\n'){
            rows++;
        }
        arr[rows][column]=ch;
        column++;
    }
for(int j=0;j<rows;j++){
    for(int k=0;k<column;k++){
    cout<<arr[j][k];}
}

But the when I run It shows the following output: https://i.stack.imgur.com/XzhST.png And the text file data is:但是当我运行它时显示以下输出: https : //i.stack.imgur.com/XzhST.png而文本文件数据是:

  I am going to school
  hi!
  Hello

guide me a bit...指导我一点...

Hmm, a 2D char array can indeed be used to store an number of lines, but you should control that you never try to store more than 50 characters for a single line, and that you never try to ouput more characters for a line than what it initially contained.嗯,一个 2D 字符数组确实可以用来存储多行,但是你应该控制你永远不要尝试为一行存储超过 50 个字符,并且你永远不要尝试为一行输出更多的字符它最初包含。

Here is a minimal fix of your code:这是您的代码的最小修复:

int rows = 0, column = 0;
char arr[50][50] = { {0 } };  // ensure the array is initialized with '\0' chars
for (;;) {
    my_file.get(ch);
    if (!my_file) break;   // eof shall be tested AFTER a read operation
    if (ch == '\n') {
        rows++;
        if (rows == 50) break;   // no more than 50 lines
        column = 0;              // reset column index for next line
    }
    else if (column < 50) {      // no more than 50 columns
        arr[rows][column] = ch;
        column++;
    }
}
for (int j = 0; j < rows; j++) {
    for (int k = 0; k < 50; k++) {
        if (arr[j][k] == 0) break;   // stop on end of line
        std::cout << arr[j][k];
    }
    std::cout << '\n';               // and display the end of line
}

And as you have been said this is rather C-ish... I assume it is only for learning how 2D arrays can work.正如你所说,这是相当 C 式的......我认为它只是为了学习二维数组的工作方式。

As pointed out in comments, you'd be much better off using a std::vectorstd::string to store the strings.正如评论中指出的那样,使用 std::vectorstd::string 存储字符串会更好。

But, this looks like a homework assignment to read then print each byte separately, so let's have a look... I'll add one of the ways this is usually done at the end of this post.但是,这看起来像是一个家庭作业,需要阅读然后分别打印每个字节,所以让我们看看......我将在本文末尾添加一种通常完成的方法。

Your output looks like this:您的输出如下所示:

在此处输入图片说明

It looks like you are displaying characters beyond the bondary of the strings, or that your strings are not null terminated... Turns out it's both.看起来您正在显示超出字符串边界的字符,或者您的字符串不是以空字符结尾的......结果两者都是。

Your code:您的代码:

int rows = 0, column = 0;
char arr[50][50];            // <-- your array is not initialized, while that is not
                             // a big issue, filling the array with zeroes is easy:
                             //  char arr[50][50] = {};

while (my_file.eof() == 0) {
    my_file.get(ch);
    if (ch == '\n') {
        rows++;             // <-- you pass to the next string, but do not put a 
                            // null character to properly terminate your strings
                            // while this could have been avoided by initializing 
                            // the array, it's best to do it explicitely.

        // replace above line contents by:
        arr[row][column] = '\0';

        if (++row >= 50)     // consider using named constants for the size of your array.
            break;           // No use keeping on reading strings if there is no 
                             // more room to store them
    }

    arr[rows][column] = ch;   // <-- I suspect a bunch un undefined stuff will 
                            // start happening when column >= 50
    column++;

    // Try replacing above code with:
    if (column < 50)      // consider using named constants for the size of your array.
        arr[rows][column++] = ch;
}

// make sure the last string is null terminated.
if (row < 50 && column < 50)
   arr[row][column] = '\0';

// note that strings that are 50 bytes long are NOT null terminated.
// that's important to keep in mind, and only workss because we'll print
// byte by byte.

// your original print routine prints out all characters in the array, even 
// stuff that was not in the original file...
for (int j = 0; j < rows; ++j){
    for (int k=0 ; k < column; ++k){   // <-- you need to check for a null 
                                       // terminating character here...
                                       // also, column is the length of the last 
                                       // string in the array.  This is not a very 
                                       // useful value for displaying any other
                                       // strings, is it?

    // try this:
    for (int k = 0; k < 50 && arr[j][k] != '\0'; ++k)
        cout << arr[j][k];
    }
    cout << '\n';                      // insert a newline after each string.
}

As you can tell, this is overly complex for doing a very common operation... Here's a more concise way of doing the same thing:正如您所看到的,这对于执行非常常见的操作来说过于复杂……这是做同样事情的更简洁的方法:

#include <vector>
#include <string>
#include <iostream>
#include <fstream>


int main()
{
    std::vector<std::string> arr;
    std::ifstream ifs("testfile.txt");

    while (ifs && !ifs.eof())
    {
        std::string str;
        std::getline(ifs, str);
        arr.push_back(str);
    }

    for (size_t i = 0; i < arr.size(); ++i)
        std::cout << arr[i] << '\n';

    return 0;
}

Because you haven't compile the array yet因为你还没有编译数组

char arr[50][50];
for (int r = 0; r < 50; r++){
    for (int c = 0; c < 50; c++){
        arr[r][c] = ' ';

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM