1

我有一个每行都有数字的文件。我正在尝试使用 read() 函数将从文件中读取的数据写入 int 数组。我可以读取文件并将其打印到终端。我怎样才能得到我读入 arr 数组的数字?

这是我的代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

int main() {
    int len, fd,arr[10000],i=0;
    fd = open("1.txt", O_RDONLY);
    if (fd >= 0) {

        while(read(fd, &len, sizeof(int)) > 0){
            write(1, &len, sizeof(int));

        }
    }

    close(fd);

    return 0;
}
4

2 回答 2

1

在大多数(全部?)实现中,整数将数字的二进制表示存储在该整数的位和字节中。另一方面,字符串和文本文件之类的内容使用字节来存储数字、空格和换行符的 ASCII 值。

int(假设 4 字节,每个字节 8 位,大端)可以这样存储值 1234:

Address   0x42  0x43  0x44  0x45
Value     0x00  0x00  0x04  0xD2
Text       NUL   NUL   EOT    Ò

另一方面,字符串可以包含代表文本的每个字符的 ASCII 值。字符串“1234”可以这样存储:

Address   0x82  0x83  0x84  0x85  0x86
Value     0x31  0x32  0x33  0x34  0x00
Text        1     2     3     4    NUL

当您进行读取时,您会读取文本文件的字符。将它们读入char数组很容易,您无需进行任何对话,只需在末尾添加 NUL-Byte。当您想获取数字时,您必须将它们从字符串转换。

这意味着您必须读取文件,read()如果需要,您可以这样做,并将内容存储在char数组中,添加 NUL 字节,然后使用类似strtol()or的函数转换结果字符串sscanf()

你在做什么

您所做的是将 ASCII 字符读入int len. 在调用前使用调试器时write(),可以检查len. 就我而言,我将其用作输入文件:

0
1
2
3
...

当我之前停止调试器时write(),我看到它len的值是170986032 == 0xA310A30. 我的系统是小端的,意味着最低字节存储在最低地址(与我之前的示例不同)。这意味着首先出现,0x30然后和。由此我们知道我们得到了以下的内存布局。0x0a0x310x0Alen

Address Offset   0x00  0x01  0x02  0x03
Value            0x30  0x0A  0x31  0x0A
Text                0    LF     1    LF

如您所见,文本被解释为int.

如何得到你想要的

您想将数据存储到char数组中。然后解析它。我使用一些伪代码来更好地解释它。这不是 C 代码。您应该学习编写自己的代码。这只是为了让您了解您必须做什么:

char buffer[<buffersize>] //create a buffer array
r=read(buffer) //read the file into the buffer. You may need to repeat that multiple times to get everything
if r==error //check for errors
  <do some error handling here>
buffer[<one after the last read byte>]='\0' //add the NUL-Byte st the end, so that we have a string.
int values[<number of ints you want>]  //create an array to store the parsed values
for(<one loop for every int>) //make the loop for every int, to parse the int
  values[<index>]=strtol(buffer,&buffer,0) //parse the text to a int
  if error occured:
    <do some error handling here>

如何在 C 中实现这一点是您的任务。请记住缓冲区大小,这样您就不会以 UB 结尾。

于 2020-11-27T15:01:18.637 回答
0
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>

int main()
{
    int fd;
    char arr[10000];
    int arr2[10000];
    ssize_t count;
    fd = open("1.txt", O_RDONLY);
    if (fd >= 0)
    {
        count = read(fd, arr, 10000); // reading from file and writing to array.
        if (count == -1)
        {
            printf("Error %d\n", errno);
            exit(0);
        }
        arr[count] = '\0';
    }

    for(int i=0; i<count; i++)  //Converting the character arrays to integer array
    {
        if(arr[i] >='0' && arr[i]<='9' )
        arr2[i] = arr[i]-'0';
        else
        {
            arr2[i] = 0; //For characters other than numbers.
        }
        
    }

    for (int i=0; i<count; i++)
    {
        printf("%d ",arr2[i]);
    }

    close(fd);

    return 0;
}

在这里,我从文件中读取数字并存储到字符数组中,然后将其转换为整数数组。如果有数字以外的任何字符,我在数组中将其分配为零。

于 2020-11-27T15:00:14.843 回答